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

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.

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.

Pentru definiții formale și exemple ale celor două strategii de evaluare, mai multe informații găsiți aici.

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

Laborator 7 - Schelet