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ț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
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