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)

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
Observați că ultimele două cazuri sunt definite recursiv.

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

Î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.

  1. 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$
  2. Implementați funcțiile care efectuează un singur pas de evaluare:
    1. funcția normal pentru evaluare normală
    2. funcția applicative pentru evaluare aplicativă
  3. 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
Urmăriți regulile de aici și comentariile din cod.

TODO