Documente Academic
Documente Profesional
Documente Cultură
andrei.olaru@cs.pub.ro | cs@andreiolaru.ro
Departamentul de Calculatoare
2020
(λ x . x y) →
−β y
1 Introducere
2 Lambda-expresii
3 Reducere
4 Evaluare
Aplicat, ii importante în
programare
demonstrarea formală a corectitudinii programelor,
datorită modelului simplu de execut, ie
1 x→
− variabila (numele) x
Ex
2 λ x .x →
− funct, ia identitate
Exemplu
3 λ x .λ y .x →
− funct, ie selector
4 (λ x .x y ) →
− aplicat, ia funct, iei identitate asupra
parametrului actual y
5 (λ x .(x x ) λ x .x ) →
− ?
1 x→
− variabila (numele) x
Ex
2 λ x .x →
− funct, ia identitate
Exemplu
3 λ x .λ y .x →
− funct, ie selector
4 (λ x .x y ) →
− aplicat, ia funct, iei identitate asupra
parametrului actual y
5 (λ x .(x x ) λ x .x ) →
− ?
1 x→
− variabila (numele) x
Ex
2 λ x .x →
− funct, ia identitate
Exemplu
3 λ x .λ y .x →
− funct, ie selector
4 (λ x .x y ) →
− aplicat, ia funct, iei identitate asupra
parametrului actual y
5 (λ x .(x x ) λ x .x ) →
− ?
1 x→
− variabila (numele) x
Ex
2 λ x .x →
− funct, ia identitate
Exemplu
3 λ x .λ y .x →
− funct, ie selector
4 (λ x .x y ) →
− aplicat, ia funct, iei identitate asupra
parametrului actual y
5 (λ x .(x x ) λ x .x ) →
− ?
1 x→
− variabila (numele) x
Ex
2 λ x .x →
− funct, ia identitate
Exemplu
3 λ x .λ y .x →
− funct, ie selector
4 (λ x .x y ) →
− aplicat, ia funct, iei identitate asupra
parametrului actual y
5 (λ x .(x x ) λ x .x ) →
− ?
1 x→
− variabila (numele) x
Ex
2 λ x .x →
− funct, ia identitate
Exemplu
3 λ x .λ y .x →
− funct, ie selector
4 (λ x .x y ) →
− aplicat, ia funct, iei identitate asupra
parametrului actual y
5 (λ x .(x x ) λ x .x ) →
− ?
+ λ -expresie
((λ x .λ y .x z ) t )
parametru formal
( ( λ x .λ y .x z ) t ) ←
parametru actual
parametru formal
( ( λ x .λ y .x z ) t ) ←
parametru actual
k
substitut, ie
⇓
(λ y .z t )
parametru formal
( ( λ x .λ y .x z ) t ) ←
parametru actual
k
substitut, ie
⇓
parametru formal
( λ y .z t ) ←
parametru actual
parametru formal
( ( λ x .λ y .x z ) t ) ←
parametru actual
k
substitut, ie
⇓
parametru formal
( λ y .z t ) ←
parametru actual
k
substitut, ie
⇓
z
parametru formal
( ( λ x .λ y .x z ) t ) ←
parametru actual
k
substitut, ie
⇓
parametru formal
( λ y .z t ) ←
parametru actual
k
substitut, ie
⇓
z
nu mai este nicio funct, ie de aplicat
parametru formal
( ( λ x .λ y .x z ) t ) ←
parametru actual
k
substitut, ie
⇓
parametru formal
( λ y .z t ) ←
parametru actual
k
substitut, ie
⇓
z
nu mai este nicio funct, ie de aplicat
· cum s, tim ce reducem, cum reducem, în ce ordine, s, i ce
aparit, ii ale variabilelor înlocuim?
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 11 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Reducere
x , x în E
<1> <2>
x în E
<3>
x în F !
<2>
x în E s, i F
x , x legate în E
<1> <2>
x în E
<3>
x în F !
<2>
x în E s, i F
x , x legate în E
<1> <2>
x liberă în E
<3>
x în F !
<2>
x în E s, i F
x , x legate în E
<1> <2>
x liberă în E
<3>
x liberă în F !
<2>
x în E s, i F
x , x legate în E
<1> <2>
x liberă în E
<3>
x liberă în F !
<2>
x liberă în E s, i F
<1> <3>
z , z în F
<1> <2>
x în F
<2>
x în E, în F
y în E
z în E, în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Variabile s, i aparit, ii ale lor
Exemplu 2
În expresia E = (λ x .λ z .(z x ) (z y )), evident, iem aparit, iile:
(λ x . λ z .( z x ) ( z y )).
<1> <1> <2> <2> <3> <1>
| {z }
F
x , x , z , z legate în E
Ex <1> <2> <1> <2>
y , z în E
Exemplu
<1> <3>
z , z în F
<1> <2>
x în F
<2>
x în E, în F
y în E
z în E, în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Variabile s, i aparit, ii ale lor
Exemplu 2
În expresia E = (λ x .λ z .(z x ) (z y )), evident, iem aparit, iile:
(λ x . λ z .( z x ) ( z y )).
<1> <1> <2> <2> <3> <1>
| {z }
F
x , x , z , z legate în E
Ex <1> <2> <1> <2>
y , z libere în E
Exemplu
<1> <3>
z , z în F
<1> <2>
x în F
<2>
x în E, în F
y în E
z în E, în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Variabile s, i aparit, ii ale lor
Exemplu 2
În expresia E = (λ x .λ z .(z x ) (z y )), evident, iem aparit, iile:
(λ x . λ z .( z x ) ( z y )).
<1> <1> <2> <2> <3> <1>
| {z }
F
x , x , z , z legate în E
Ex <1> <2> <1> <2>
y , z libere în E
Exemplu
<1> <3>
z , z legate în F
<1> <2>
x în F
<2>
x în E, în F
y în E
z în E, în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Variabile s, i aparit, ii ale lor
Exemplu 2
În expresia E = (λ x .λ z .(z x ) (z y )), evident, iem aparit, iile:
(λ x . λ z .( z x ) ( z y )).
<1> <1> <2> <2> <3> <1>
| {z }
F
x , x , z , z legate în E
Ex <1> <2> <1> <2>
y , z libere în E
Exemplu
<1> <3>
z , z legate în F
<1> <2>
x liberă în F
<2>
x în E, în F
y în E
z în E, în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Variabile s, i aparit, ii ale lor
Exemplu 2
În expresia E = (λ x .λ z .(z x ) (z y )), evident, iem aparit, iile:
(λ x . λ z .( z x ) ( z y )).
<1> <1> <2> <2> <3> <1>
| {z }
F
x , x , z , z legate în E
Ex <1> <2> <1> <2>
y , z libere în E
Exemplu
<1> <3>
z , z legate în F
<1> <2>
x liberă în F
<2>
x legată în E, dar liberă în F
y în E
z în E, în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Variabile s, i aparit, ii ale lor
Exemplu 2
În expresia E = (λ x .λ z .(z x ) (z y )), evident, iem aparit, iile:
(λ x . λ z .( z x ) ( z y )).
<1> <1> <2> <2> <3> <1>
| {z }
F
x , x , z , z legate în E
Ex <1> <2> <1> <2>
y , z libere în E
Exemplu
<1> <3>
z , z legate în F
<1> <2>
x liberă în F
<2>
x legată în E, dar liberă în F
y liberă în E
z în E, în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Variabile s, i aparit, ii ale lor
Exemplu 2
În expresia E = (λ x .λ z .(z x ) (z y )), evident, iem aparit, iile:
(λ x . λ z .( z x ) ( z y )).
<1> <1> <2> <2> <3> <1>
| {z }
F
x , x , z , z legate în E
Ex <1> <2> <1> <2>
y , z libere în E
Exemplu
<1> <3>
z , z legate în F
<1> <2>
x liberă în F
<2>
x legată în E, dar liberă în F
y liberă în E
z liberă în E, dar legată în F
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 18 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Determinarea variabilelor libere s, i legate
O abordare formală
(λ x .x λ x .λ y .x ) · · ·
(λ x .x a) · · ·
(λ x .x λ x .λ y .x ) →
− închisă
(λ x .x a) · · ·
(λ x .x λ x .λ y .x ) →
− închisă
(λ x .x a) →
− deschisă, deoarece a este liberă
(λ x .E A) →
− β E[A/x ]
− β x[y /x ] →
(λ x .x y ) → − y
Ex (λ x .λ x .x y )
Exemplu
(λ x .λ y .x y )
− β x[y /x ] →
(λ x .x y ) → − y
Ex − β λ x .x[y /x ] →
(λ x .λ x .x y ) → − λ x .x
Exemplu
(λ x .λ y .x y )
− β x[y /x ] →
(λ x .x y ) → − y
Ex − β λ x .x[y /x ] →
(λ x .λ x .x y ) → − λ x .x
Exemplu
(λ x .λ y .x y ) →
− β λ y .x[y /x ] →
− λ y .y
− β x[y /x ] →
(λ x .x y ) → − y
Ex − β λ x .x[y /x ] →
(λ x .λ x .x y ) → − λ x .x
Exemplu
(λ x .λ y .x y ) →
− β λ y .x[y /x ] →
− λ y .y Gres, it! Variabila
liberă y devine legată, schimbându-s, i semnificat, ia.
− λ y (a) .y (b)
→
− β x[y /x ] →
(λ x .x y ) → − y
Ex − β λ x .x[y /x ] →
(λ x .λ x .x y ) → − λ x .x
Exemplu
(λ x .λ y .x y ) →
− β λ y .x[y /x ] →
− λ y .y Gres, it! Variabila
liberă y devine legată, schimbându-s, i semnificat, ia.
− λ y (a) .y (b)
→
Ex Exemplu
(λ x .λ y .x y ) →
− α (λ x .λ z .x y ) →
− β λ z .x[y /x ] →
− λ z .y
Ex
Exemplu
λ x .y →
− α λ y .y[y /x ] →
− λ y .y
λ x .λ y .x →
− α λ y .λ y .x[y /x ] →
− λ y .λ y .y
Ex
Exemplu
λ x .y →
− α λ y .y[y /x ] → − Gres, it!
− λ y .y →
λ x .λ y .x →
− α λ y .λ y .x[y /x ] →
− λ y .λ y .y
Ex
Exemplu
λ x .y →
− α λ y .y[y /x ] → − Gres, it!
− λ y .y →
λ x .λ y .x →
− α λ y .λ y .x[y /x ] →
− λ y .λ y .y →
− Gres, it!
Ex
Exemplu
λ x .y →
− α λ y .y[y /x ] → − Gres, it!
− λ y .y →
λ x .λ y .x →
− α λ y .λ y .x[y /x ] →
− λ y .λ y .y →
− Gres, it!
..
. Condit, ii
y nu este o variabilă liberă, existentă deja în E
orice aparit, ie liberă în E rămâne liberă în E[y /x ]
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 24 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
α -conversie
Exemple
λ x .(x y ) → − Corect!
− α λ z .(z y ) →
λ x .λ x .(x y ) →
− α λ y .λ x .(x y )
Ex
Exemplu
λ x .λ y .(y x ) →
− α λ y .λ y .(y y )
λ x .λ y .(y y ) →
− α λ y .λ y .(y y )
λ x .(x y ) → − Corect!
− α λ z .(z y ) →
λ x .λ x .(x y ) →
− α λ y .λ x .(x y ) →
− Gres, it! y este liberă în
Ex λ x .(x y )
Exemplu
λ x .λ y .(y x ) →
− α λ y .λ y .(y y )
λ x .λ y .(y y ) →
− α λ y .λ y .(y y )
λ x .(x y ) → − Corect!
− α λ z .(z y ) →
λ x .λ x .(x y ) →
− α λ y .λ x .(x y ) →
− Gres, it! y este liberă în
Ex λ x .(x y )
Exemplu
λ x .λ y .(y y ) →
− α λ y .λ y .(y y )
λ x .(x y ) → − Corect!
− α λ z .(z y ) →
λ x .λ x .(x y ) →
− α λ y .λ x .(x y ) →
− Gres, it! y este liberă în
Ex λ x .(x y )
Exemplu
λ x .λ y .(y y ) → − Corect!
− α λ y .λ y .(y y ) →
..
. Reducere
E1 → − ∗ E2 – un pas este o secvent, ă
− E2 =⇒ E1 →
− ∗ E2 ∧ E2 →
E1 → − ∗ E3 ⇒ E1 →
− ∗ E3 – tranzitivitate
Ex
((λ x .λ y .((y x ) y ) λ x .x ) →
− (λ z .(z y ) λ x .x ) →
− (λ x .x y ) →
− y
Exemplu
⇒
−∗y
((λ x .λ y .((y x ) y ) λ x .x ) →
Ex
Ω = (λ x .(x x ) λ x .(x x )) → − ∗ ...
− (λ x .(x x ) λ x .(x x )) →
Exemplu
Ex
Ω = (λ x .(x x ) λ x .(x x )) → − ∗ ...
− (λ x .(x x ) λ x .(x x )) →
Exemplu
...
n ∗
→ y, n ≥ 0
−
∞ ∗
−
→ ...
...
n ∗
→ y, n ≥ 0
−
∞ ∗
−
→ ...
E are o secvent, ă de reducere care nu se termină;
dar E are forma normală y ⇒ E este reductibilă;
lungimea secvent, elor de reducere ale E este
nemărginită.
Ex Exemplu
(λ x .λ y .(x y ) λ x .x ) →
− FNF λ y .(λ x .x y ) →
− FN λ y .y
∗ E1 ∗
E E3
∗ E2 ∗
Ex
(λ x .λ y .(x y ) (λ x .x y ))
Exemplu
− λ z .((λ x .x y ) z ) →
→ − λ z .(y z ) →
− α λ a.(y a)
− (λ x .λ y .(x y ) y ) →
→ − λ w .(y w ) →
− α λ a.(y a)
Ex
(λ x .λ y .(x y ) (λ x .x y ))
Exemplu
− λ z .((λ x .x y ) z ) →
→ − λ z .(y z ) →
− α λ a.(y a)
− (λ x .λ y .(x y ) y ) →
→ − λ w .(y w ) →
− α λ a.(y a)
Ex
(λ x .λ y .(x y ) (λ x .x y ))
Exemplu
− λ z .((λ x .x y ) z ) →
→ − λ z .(y z ) →
− α λ a.(y a)
− (λ x .λ y .(x y ) y ) →
→ − λ w .(y w ) →
− α λ a.(y a)
Ex Exemplu
((λ x .x λ x .y ) (λ x .(x x ) λ x .(x x ))) →
− (λ x .y Ω) →
− y
Ex Exemplu
(λ x .(λ x .x λ x .y ) (λ x .(x x ) λ x .(x x ))) →
−
(λ x .(λ x .x λ x .y ) Ω) →
− ...
Introducere λ -Expresii Reducere Evaluare λ0 s, i TDA Racket vs. lambda-0
3 : 36 / 18
· · · · · · · · · · · · · · · · ·
Paradigme de Programare – Andrei Olaru
Ce modalitate alegem?
Datele →
− λ -expresii;
..
. Componente
constructori de bază: cum se generează valorile;
operatori: ce se poate face cu acestea;
axiome: cum lucrează operatorii / ce restrict, ii există.
T: →
− Bool
· Constructori:
F: →
− Bool
not : Bool →
− Bool
and : Bool 2 →
− Bool
· Operatori: 2
or : Bool → − Bool
if : Bool × A × A →
− A
T: →
− Bool
· Constructori:
F: →
− Bool
not : Bool →
− Bool
and : Bool 2 →
− Bool
· Operatori: 2
or : Bool → − Bool
if : Bool × A × A →
− A
T: →
− Bool
· Constructori:
F: →
− Bool
not : Bool →
− Bool
and : Bool 2 →
− Bool
· Operatori: 2
or : Bool → − Bool
if : Bool × A × A →
− A
T ≡def λ x .λ y .x
F ≡def λ x .λ y .y
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
if ≡def λ c .λ x .λ y .((c x ) y )
or ≡def λ x .λ y .((x T ) y )
((or T ) a) →
− ((λ x .λ y .((x T ) y ) T ) a) →
− ((T T ) a) →
− T
((or F ) a) →
− ((λ x .λ y .((x T ) y ) F ) a) →
− ((F T ) a) →
− a
Prevenirea erorilor;
Ex
Fix = λ f .(λ x .(f (x x )) λ x .(f (x x )))
Exemplu
λ Racket
Variabilă/nume x x
Funct, ie λ x .corp (lambda (x) corp)
uncurry λ x y .corp (lambda (x y) corp)
Aplicare (F A) (f a)
uncurry (F A1 A2) (f a1 a2)
Legare top-level - (define nume expr)
Program λ -expresie colect, ie de legări
închisă top-level (define)
Valori λ -expresii / TDA valori de diverse
tipuri (numere, liste,
etc.)
tipat – dinamic/latent
variabilele nu au tip;
valorile au tip (3, #f);
verificarea se face la execut, ie, în momentul aplicării unei
funct, ii;
evaluare aplicativă;