Differences

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

Link to this comparison view

pp:26:teme:haskell-graphs [2026/05/09 21:01]
mihnea.muraru [Etapa 2]
pp:26:teme:haskell-graphs [2026/05/13 17:40] (current)
mihnea.muraru
Line 2: Line 2:
  
   * Data publicării:​ 27.04.2026   * Data publicării:​ 27.04.2026
-  * Data ultimei modificări: ​27.04.2026+  * Data ultimei modificări: ​13.05.2026
   * Deadline hard: ziua laboratorului 12   * Deadline hard: ziua laboratorului 12
   * [[https://​curs.upb.ro/​2025/​mod/​forum/​view.php?​id=169983|Forum temă]]   * [[https://​curs.upb.ro/​2025/​mod/​forum/​view.php?​id=169983|Forum temă]]
Line 238: Line 238:
  
 Funcțiile care nu respectă constrângerile din schelet vor fi **depunctate total**. Funcțiile care nu respectă constrângerile din schelet vor fi **depunctate total**.
 +
 +===== Etapa 4 =====
 +
 +În această etapă:
 +
 +  * 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ță**,​ **modularitate** și **reutilizare**,​ concomitent.
 +
 +În etapa 4, **scheletul** conține următoarele module:
 +
 +  * ''​%%AlgebraicGraph%%''​
 +    * Instanța clasei ''​%%Foldable%%''​ permite reducerea unui graf la o valoare.
 +    * Funcția ''​nodesWithFoldr''​ constituie o alternativă la funcția ''​nodes''​ din etapele 2-3, dar implementată de data aceasta cu ''​foldr''​.
 +    * 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ă**.
 +      * **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.
 +    * 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''​.
 +    * Operatorii ''​(<​+>​)''​ și ''​(>​.>​)'',​ **deja implementați**,​ permit **combinarea** unor ''​AlgebraicGraphFolder''​-e **independente**,​ respectiv **semidependente**.
 +    * Funcția ''​nodes''​ este reimplementată utilizând noul mecanism de reducere.
 +    * Funcția ''​isNode''​ verifică dacă un nod apare într-un graf, utilizând noul mecanism de reducere.
 +    * 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.
 +  * ''​StandardGraph''​
 +    * Este cel din etapa 1, și este necesar următorului modul.
 +    * Nu trebuie nimic implementat suplimentar aici.
 +  * ''​Algorithms''​
 +    * 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ă.
 +      * **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.
 +
 +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 ====
 +
 +Funcțiile care nu respectă constrângerile de mai sus sau pe cele din schelet vor fi **depunctate total**.
  
  
Line 251: 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 258: Line 295:
 ===== Changelog ===== ===== Changelog =====
  
- +  * 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ă.
pp/26/teme/haskell-graphs.1778349708.txt.gz · Last modified: 2026/05/09 21:01 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