Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pp:26:teme:haskell-graphs-draft [2026/05/13 16:55]
mihnea.muraru [Etapa 4]
pp:26:teme:haskell-graphs-draft [2026/05/13 17:37] (current)
mihnea.muraru [Changelog]
Line 244: Line 244:
  
   * veți experimenta cu un stil de raționament specific programării funcționale,​ numit **//​equational reasoning//​**   * veți experimenta cu un stil de raționament specific programării funcționale,​ numit **//​equational reasoning//​**
-  * utilizându-l,​ veți **rafina** anumite implementări din etapele anterioare pentru un plus de **eficiență** și **modularitate**.+  * utilizându-l,​ veți **rafina** anumite implementări din etapele anterioare pentru un plus de **eficiență**, **modularitate** și **reutilizare**, concomitent.
  
 În etapa 4, **scheletul** conține următoarele module: În etapa 4, **scheletul** conține următoarele module:
  
   * ''​%%AlgebraicGraph%%''​   * ''​%%AlgebraicGraph%%''​
-    * Funcțiile ''​%%nodes%%''​''​%%edges%%''​''​%%outNeighbors%%'',​ ''​%%inNeighbors%%'' ​sunt cele din etapa 2+    * Instanța clasei ​''​%%Foldable%%'' ​permite reducerea unui graf la o valoare. 
-    * Instanța clasei ​''​%%Num%%'' ​permite interpretarea unei **expresii aritmetice** ca un graf algebric, în care literalii numerici sunt etichete de noduri, iar adunarea și înmulțirea reprezintă operațiile ​''​%%Overlay%%''​, respectiv ​''​%%Connect%%''​. De exemplugraful din diagrama de mai sus poate fi reprezentat prin expresia aritmetică ''​%%((1*2) (3+4)) * 5%%''​. +    * Funcția ​''​nodesWithFoldr'' ​constituie o alternativă la funcția ​''​nodes'' ​din etapele 2-3dar implementată de data aceasta cu ''​foldr''​. 
-    * Instanțclasei ​''​%%Show%%'' ​permite descrierea grafului sub forma unui **șir de caractere**, utilizând perspectiva aritmetică de mai sus+    * Funcția ''​nodesEdges'' ​combină prin **//tupling//** comportamentele funcțiilor ''​nodes'' ​și ''​edges'' ​într-o singură transformare compozițională**mai eficientă** decât vechea implementare ​lui ''​edges''​, dar din păcate ​**mai puțin modulară**. 
-    Instanța clasei ''​%%Eq%%''​ permite verificarea corectă a **egalității** dintre două grafuri algebrice, ​ținând cont că același graf conceptual poate avea două descrieri simbolice diferite+      **Atenție!** Scopul este de a **nu** elabora de la zero implementarea,​ ci de a o obține prin **//​equational reasoning//** urmărind indicațiile din comentarii
-    * Funcția ​''​%%extend%%'' ​permite **elaborarea** unui graf, prin atașarea unor subgrafuri oarecare în locul nodurilor, în baza unei funcții de corespondență. Funcția ''​%%extend%%''​ constituie **baza implementării** tuturor operațiilor ​de mai jos. +    * Constructorul de tip ''​AlgebraicGraphFolder''​ șfuncția ''​foldAlgebraicGraph''​, **deja implementate**, ​constituie ​un mecanism de **reducere** croit pe constructorul ​de tip ''​AlgebraicGraph''​, fiind astfel mai expresiv decât instanța de ''​Foldable''​. 
-    * Funcția familiară ​''​%%splitNode%%'' ​va fi **reimplementată** utilizând ​''​%%extend%%''​. +    * Operatorii ​''​(<+>)'' ​și ''​(>.>)'',​ **deja implementați**, permit **combinarea** unor ''​AlgebraicGraphFolder''​-e **independente**respectiv ​**semidependente**. 
-    * Instanța clasei ​''​%%Functor%%''​, prin operația ​''​%%fmap%%'',​ **generalizează** funcționala ​''​%%map%%'' ​de pe liste pe grafuripermițând ​**aplicarea unei funcții** pe toate etichetele nodurilor dintr-un grafImplementarea va utiliza ​''​%%extend%%''​. +    * Funcția ​''​nodes'' ​este reimplementată utilizând noul mecanism de reducere
-    * Funcția ​familiară ​''​%%mergeNodes%%'' ​va fi **reimplementată** utilizând ​''​%%fmap%%''​+    * Funcția ''​isNode'' ​verifică dacă un nod apare într-un graf, utilizând ​noul mecanism de reducere
-    * Funcționala ​''​%%filterGraph%%''​ **generalizează** funcționala ​''​%%filter%%'' ​de pe liste pe grafuripentru a **păstra** doar nodurile ale căror etichete satisfac o proprietate. Implementarea va utiliza ​''​%%extend%%''​+    * Funcția ''​edges'' ​este reimplementată prin **asamblarea** ''​AlgebraicGraphFolder''​-ului aferent ​funcției ''​nodes'', ​cu un alt ''​AlgebraicGraphFolder''​, într-o manieră **semidependentă**, obținându-se concomitent un **plus** de eficiență,​ modularitate și reutilizare
-    * Funcția familiară ''​%%removeNode%%''​ va fi **reimplementată** utilizând ''​%%filterGraph%%''​+  * ''​StandardGraph''​ 
-  * ''​%%Modular%%''​ +    * Este cel din etapa 1, și este necesar următorului modul. 
-    * Funcțiile ''​%%mapSingle%%'' ​și ''​%%partitions%%'' ​sunt cele din etapa 2. +    * Nu trebuie nimic implementat suplimentar aici. 
-    * Funcția ''​%%isModule%%'' ​verifică dacă o mulțime candidat de noduri constituie într-adevăr un **modul** (vedeți explicațiile din etapa 2). +  * ''​Algorithms''​ 
-    * Funcția ​''​%%isModularPartition%%'' ​verifică dacă partiție candidat este într-adevă**modulară**, i.e. dacă toate **submulțimile** sunt module. +    * Funcția ''​dfsStack'' ​constituie o alternativă mai eficientă, bazată pe stivă, a funcției ''​dfs'' ​din etapa 1, în care fiecare element este vizitat cel mult dată
-    ​Funcția ''​%%maximalModularPartition%%''​ determină cea mai acoperitoare partiție, pornind ​de la lista tuturor partițiilor mulțimii ​de noduri (vedeți explicațiile din comentarii). +      ​* **Atenție!** Scopul este de a **nu** elabora ​de la zero implementarea,​ ci de a o obține prin **//​equational reasoning//** pornind de la implementarea din etapa 1 și de la indicațiile ​din comentarii.
-    ​Funcția ''​%%modularlyDecompose%%''​ este **deja implementată**, și vă permite să puneți cap la cap funcțiile ​de mai sus.+
  
-Este suficient ca arhiva pentru **vmchecker** să conțină modulele ''​%%AlgebraicGraph%%''​ și ''​%%Modular%%''​.+Se impun următoarele **constrângeri**:​ 
 + 
 +  * Pentru funcțiile ''​nodesEdges''​ din modulul ''​AlgebraicGraph''​ și ''​dfsStack''​ din modulul ''​Algorithms'',​ a căror implementare trebuie obținută prin **//​equational reasoning//​**,​ trebuie să redactați în comentarii, în porțiunea ''​DERIVARE:​ ...'',​ pașii prin care ați trecut (vedeți exemplele și exercițiile din laboratorul 11). 
 + 
 +Este suficient ca arhiva pentru **vmchecker** să conțină modulele ''​AlgebraicGraph'',​ ''​StandardGraph''​ și ''​Algorithms''​.
  
 ==== Depunctări ==== ==== Depunctări ====
  
-Funcțiile care nu respectă constrângerile din schelet vor fi **depunctate total**.+Funcțiile care nu respectă constrângerile ​de mai sus sau pe cele din schelet vor fi **depunctate total**.
  
  
Line 284: Line 287:
   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​26/​teme/​haskell/​etapa2.zip|Schelet etapa 2]]   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​26/​teme/​haskell/​etapa2.zip|Schelet etapa 2]]
   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​26/​teme/​haskell/​etapa3.zip|Schelet etapa 3]]   * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​26/​teme/​haskell/​etapa3.zip|Schelet etapa 3]]
 +  * [[https://​ocw.cs.pub.ro/​courses/​_media/​pp/​26/​teme/​haskell/​etapa4.zip|Schelet etapa 4]]
  
 ===== Referințe ===== ===== Referințe =====
Line 291: Line 295:
 ===== Changelog ===== ===== Changelog =====
  
-  * 13.05, 17:30: Publicat etapa 4+  * 13.05, 17:40: Publicat etapa 4
   * 09.05, 21:02: Adăugat clarificare la etapa 2 despre semnificația constrângerii de recursivitate explicită.   * 09.05, 21:02: Adăugat clarificare la etapa 2 despre semnificația constrângerii de recursivitate explicită.
pp/26/teme/haskell-graphs-draft.1778680541.txt.gz · Last modified: 2026/05/13 16:55 by mihnea.muraru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0