This shows you the differences between two versions of the page.
|
pp:26:teme:haskell-graphs-draft [2026/05/13 16:54] 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//** | ||
| - | * îl veți aplica pentru a **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 exemplu, graful 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-3, dar implementată de data aceasta cu ''foldr''. |
| - | * Instanța 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 a 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'' și 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 grafuri, permițând **aplicarea unei funcții** pe toate etichetele nodurilor dintr-un graf. Implementarea 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 grafuri, pentru 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ă o partiție candidat este într-adevăr **modulară**, i.e. dacă toate **submulțimile** sunt module. | + | * Funcția ''dfsStack'' constituie o alternativă mai eficientă, bazată pe o stivă, a funcției ''dfs'' din etapa 1, în care fiecare element este vizitat cel mult o 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ă. | ||