This is an old revision of the document!
Evaluare expresii lambda
Scopul laboratorului:
- obișnuirea studenților cu calculul lambda:
- ce e o expresie
- ce sunt variabilele libere/legate
- cum se evaluează o expresie
- implementarea unei aplicații practice de evaluare a expresiilor lambda (în Haskell)
Calcul lambda
Calculul lambda este un model computațional (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țiefuncț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 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ă substituție de variabile (posibil cu redenumire). Aplicând repetat pașii de evaluare putem obține un rezultat. Găsiți mai multe informații despre evaluare 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.
De asemenea, există expresii pe care, deși o strategie de evaluare produce un rezultat, o altă strategie poate să cicleze.
Pentru definiții formale și exemple ale celor două strategii de evaluare, mai multe informații găsiți aici.
Exerciții
Î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
șiEq
- 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
sauapplicative
) și evaluează o expresie până la capăt