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
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
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
Recommended Reading
TODO