Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
pp:llambdacalc [2019/04/07 18:46]
dmihai [Calcul lambda]
pp:llambdacalc [2020/02/05 15:50] (current)
dmihai [Exerciții]
Line 10: Line 10:
 ===== Calcul lambda ===== ===== Calcul lambda =====
  
-[[https://​en.wikipedia.org/​wiki/​Lambda_calculus|Calculul lambda]] este un model computațional ([[https://​en.wikipedia.org/​wiki/​Church%E2%80%93Turing_thesis|echivalent  ​din punct de vedere ​al expresivității cu Mașina Turing]]), bazat pe funcții, ​în care computația este exprimată ca o serie succesivă de aplicări de funcții, i.e. substituții de variabile.+[[https://​en.wikipedia.org/​wiki/​Lambda_calculus|Calculul lambda]] este un model computațional ([[https://​en.wikipedia.org/​wiki/​Church%E2%80%93Turing_thesis|echivalent  ​dpv al expresivității cu Mașina Turing]]) în care computația este exprimată ca o serie succesivă de aplicări de funcții, i.e. substituții de variabile. Calculul lambda are la bază expresii lambda și reguli de transformare a acestora.
  
 +==== Expresii lambda ====
 +
 +O **expresie lambda** are trei forme posibile:
 +
 +  * **variabilă**
 +    * $ x$ - unde $ x$ este un nume/simbol
 +  * **abstracție** / **funcție**
 +    * $\lambda x . E$ - unde $ x$ este un nume/​simbol,​ iar $ E$ este o expresie lambda
 +  * **aplicație**
 +    * $(E_1\ E_2)$ - unde $ E_1$ și $ E_2$ sunt expresii lambda
 +
 +<​note>​
 +Observați că ultimele două cazuri sunt definite //​recursiv//​.
 +</​note>​
 +
 +Variabilele modelează valori.
 +
 +Abstracțiile de forma $\lambda x.E$ modelează funcții anonime cu un singur //argument formal// $ x$, și corpul $ E$.
 +
 +Aplicațiile de forma $(E_1\ E_2)$ modelează aplicarea expresiei $ E_1$ peste //​argumentul concret// $ E_2$.
 +
 +Mai multe informații găsiți [[pp:​lambda#​syntax|aici]].
 +
 +=== Exemple ===
 +
 +$ y$
 +
 +$\lambda x.x$
 +
 +$(\lambda x.x\ y)$
 +
 +$((\lambda x.\lambda y.x\ z)\ \lambda x.x)$
 +
 +==== Evaluare ====
 +
 +Evaluarea unei expresii lambda constă într-o serie succesivă de transformări (redenumiri de variabile, substituții de variabile cu alte expresii). Un pas de evaluare constă într-o singură [[https://​en.wikipedia.org/​wiki/​Lambda_calculus#​%CE%B2-reduction|substituție de variabile]] (posibil cu [[https://​en.wikipedia.org/​wiki/​Lambda_calculus#​%CE%B1-conversion|redenumire]]). Aplicând repetat pașii de evaluare putem obține un rezultat. Găsiți mai multe informații despre evaluare [[:​pp:​lambda#​the_semantics_of_the_lambda_calculus|aici]].
 +
 +O //strategie de evaluare// este un set de reguli de a aplica substituții. Distingem între **evaluare aplicativă** și **evaluare normală**. Informal, evaluarea aplicativă evaluează mai întâi argumentele,​ apoi expresia cu totul, iar evaluarea normală evaluează întâi expresia, pasând funcțiilor argumente neevaluate.
 +
 +<​note>​
 +Nu orice expresii lambda poate fi evaluată până la capăt. Pentru unele expresii, evaluarea poate cicla.
 +
 +De asemenea, există expresii pe care, deși o strategie de evaluare produce un rezultat, o altă strategie poate să cicleze.
 +</​note>​
 +
 +Pentru definiții formale și exemple ale celor două strategii de evaluare, mai multe informații găsiți [[:​pp:​lambda#​step_2_reduction_order_s|aici]].
 ===== Exerciții ===== ===== Exerciții =====
  
-TODO+În scheletul de laborator, aveți patru fișiere: 
 + 
 +  * ''​Expr.hs''​ 
 +    * tipul de date folosit pentru a modela expresii lambda 
 +    * înrolări în clasele ''​Show''​ și ''​Eq''​ 
 +    * alte funcții utile (urmăriți comentariile din cod) 
 +  * ''​Eval.hs''​ 
 +    * semnăturile funcțiilor de substituție,​ evaluare cu un singur pas (normală și aplicativă) și evaluare pe mai mulți pași 
 +    * pentru exercițiile de laborator, trebuie să completați acest fișier 
 + 
 +Fișierele ''​Parser.hs''​ și ''​ParseExpr.hs''​ au scopul de a putea defini teste lizibile; puteți ignora conținutul lor. 
 + 
 +  - Implementați funcția ''​subst'',​ care înlocuiește toate aparițiile libere ale unui variabile $ x$ din expresia $ E_1$ cu o expresie $ E_2$ 
 +  - Implementați funcțiile care efectuează un singur pas de evaluare: 
 +    - funcția ''​normal''​ pentru evaluare normală 
 +    - funcția ''​applicative''​ pentru evaluare aplicativă 
 +  - Implementați funcția ''​eval'',​ care primește un evaluator de un singur pas (i.e. ''​normal''​ sau ''​applicative''​) și evaluează o expresie până la capăt
  
-===== Recommended Reading =====+<note tip> 
 +Urmăriți regulile de [[http://​ocw.cs.pub.ro/​ppcarte/​doku.php?​id=pp:​lambda#​the_semantics_of_the_lambda_calculus|aici]] și comentariile din cod. 
 +</​note>​
  
-TODO+{{:​pp:​laborator_7_-_schelet.zip|Laborator 7 - Schelet}}\\