Differences
This shows you the differences between two versions of the page.
| 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}}\\ |