Sunteți pe pagina 1din 42

Fundamentele limbajelor de programare

C05

Denisa Diaconescu
Traian S, erbănut, ă

Departamentul de Informatică, FMI, UB

1
Lambda calcul cu tipuri simple
Probleme cu lambda calculul fără tipuri

Proprietăt, i negative ale lambda calculului fără tipuri:

- Aplicări de forma x x sau M M sunt pemise,


des, i sunt contraintuitive.

- Existent, a formelor normale pentru λ-termeni nu este garantată


s, i putem avea "calcule infinite" nedorite

- Orice λ-termen are un punct fix ceea ce nu este în armonie cu


ceea ce s, tiam despre funct, ii oarecare

Vrem să eliminăm aceste proprietăt, i negative, păstrându-le pe cele


pozitive.

Proprietăt, ile negative sunt eliminate prin adăugarea de tipuri ceea


ce induce restrict, iile dorite pe termeni.

2
Tipuri simple

Fie V = {α, β, γ, . . .} o mult, ime infinită de tipuri variabilă.


Mult, imea tuturor tipurilor simple T este definită prin
T=V|T→T
• (Tipul variabilă) Dacă α ∈ V, atunci α ∈ T.
• (Tipul săgeată) Dacă σ, τ ∈ T, atunci (σ → τ) ∈ T.
Câteodată vom nota tipurile simple s, i cu litere A , B , . . ..

Tipurile variabilă sunt reprezentări abstracte pentru tipuri de bază


cum ar fi Nat pentru numere naturale, List pentru liste etc.

Tipurile săgeată reprezintă tipuri pentru funct, ii cum ar fi


• Nat → Real, mult, imea tuturor funct, iilor de la numere naturale la
numere reale
• (Nat → Int ) → (Int → Nat ), mult, imea tuturor funct, iilor care au
ca intrare o funct, ie de la numere naturale la întregi s, i produce o
funct, ie de la întregi la numere naturale. 3
Tipuri simple

Mult, imea tipurilor simple T=V|T→T

Exemple de tipuri simple:


• γ
• (β → γ)
• ((γ → α) → (α → (β → γ)))

În tipurile săgeată, parantezele exterioare pot fi omise.

Parantezele în tipurile săgeată sunt asociative la dreapta.


De exemplu,
• α1 → α2 → α3 → α4 este abreviere pentru
(α1 → (α2 → (α3 → α4 )))
• x1 x2 x3 x4 este abreviere pentru (((x1 x2 ) x3 ) x4 )

4
Termeni s, i tipuri

Ce înseamnă că un termen M are un tip σ?


Vom nota acest lucru cu M : σ.

5
Termeni s, i tipuri

Ce înseamnă că un termen M are un tip σ?


Vom nota acest lucru cu M : σ.

Variabilă. Dacă o variabilă x are un tip σ, notăm cu x : σ.


Convent, ia Barendregt: variabilele legate sunt distincte.
Presupunem că orice variabilă din M are un unic tip.
Dacă x : σ s, i x : τ, atunci σ ≡ τ.

5
Termeni s, i tipuri

Ce înseamnă că un termen M are un tip σ?


Vom nota acest lucru cu M : σ.

Variabilă. Dacă o variabilă x are un tip σ, notăm cu x : σ.


Convent, ia Barendregt: variabilele legate sunt distincte.
Presupunem că orice variabilă din M are un unic tip.
Dacă x : σ s, i x : τ, atunci σ ≡ τ.

Aplicare. Pentru M N este clar că vrem să s, tim tipurile lui M s, i N.
Intuitiv, M N înseamnă că ("funct, ia") M este aplicată ("intrării") N.
Atunci M trebuie să aibă un tip funct, ie, adică M : σ → τ, iar N
trebuie să fie "adecvat" pentru această funct, ie, adică N : σ.
Dacă M : σ → τ s, i N : σ, atunci M N : τ.

5
Termeni s, i tipuri

Ce înseamnă că un termen M are un tip σ?


Vom nota acest lucru cu M : σ.

Variabilă. Dacă o variabilă x are un tip σ, notăm cu x : σ.


Convent, ia Barendregt: variabilele legate sunt distincte.
Presupunem că orice variabilă din M are un unic tip.
Dacă x : σ s, i x : τ, atunci σ ≡ τ.

Aplicare. Pentru M N este clar că vrem să s, tim tipurile lui M s, i N.
Intuitiv, M N înseamnă că ("funct, ia") M este aplicată ("intrării") N.
Atunci M trebuie să aibă un tip funct, ie, adică M : σ → τ, iar N
trebuie să fie "adecvat" pentru această funct, ie, adică N : σ.
Dacă M : σ → τ s, i N : σ, atunci M N : τ.

Abstractizare. Dacă M : τ, ce tip trebuie sa aibă λx . M?


Dacă x : σ s, i M : τ, atunci λx . M : σ → τ. 5
Termeni s, i tipuri

Variabilă. x : σ.
Aplicare. Dacă M : σ → τ s, i N : σ, atunci M N : τ.
Abstractizare. Dacă x : σ s, i M : τ, atunci λx . M : σ → τ.

M are tip (este typeable) dacă există un tip σ astfel încât M : σ.

6
Termeni s, i tipuri

Variabilă. x : σ.
Aplicare. Dacă M : σ → τ s, i N : σ, atunci M N : τ.
Abstractizare. Dacă x : σ s, i M : τ, atunci λx . M : σ → τ.

M are tip (este typeable) dacă există un tip σ astfel încât M : σ.

Exemple.
• Dacă x : σ, atunci funct, ia identitate are tipul λx . x : σ → σ.

6
Termeni s, i tipuri

Variabilă. x : σ.
Aplicare. Dacă M : σ → τ s, i N : σ, atunci M N : τ.
Abstractizare. Dacă x : σ s, i M : τ, atunci λx . M : σ → τ.

M are tip (este typeable) dacă există un tip σ astfel încât M : σ.

Exemple.
• Dacă x : σ, atunci funct, ia identitate are tipul λx . x : σ → σ.
• Conform convent, iilor de la aplicare, y x poate avea un tip doar
dacă y are un tip săgeată de forma σ → τ s, i tipul lui x se
potrives, te cu tipul domeniu σ. În acest caz, tipul lui y x : τ.

6
Termeni s, i tipuri

Variabilă. x : σ.
Aplicare. Dacă M : σ → τ s, i N : σ, atunci M N : τ.
Abstractizare. Dacă x : σ s, i M : τ, atunci λx . M : σ → τ.

M are tip (este typeable) dacă există un tip σ astfel încât M : σ.

Exemple.
• Dacă x : σ, atunci funct, ia identitate are tipul λx . x : σ → σ.
• Conform convent, iilor de la aplicare, y x poate avea un tip doar
dacă y are un tip săgeată de forma σ → τ s, i tipul lui x se
potrives, te cu tipul domeniu σ. În acest caz, tipul lui y x : τ.
• Termenul x x nu poate avea nici un tip (nu este typeable).
Pe de o parte, x ar trebui să aibă tipul σ → τ (pentru prima
aparit, ie), pe de altă ar trebui să aibă tipul σ (pentru a doua
aparit, ie). Cum am stabilit că orice variabilă are un unic tip,
6
obt, inem σ → τ ≡ σ, ceea ce este imposibil.
Discut, ie despre asocitativitate

Asociativitatea la dreapta pentru tipurile săgeată vs. asociativitatea


la stânga pentru aplicare:

• Să presupunem că f : ρ → (σ → τ), x : ρ s, i y : σ.


• Atunci f x : σ → τ s, i (f x ) y : τ.

7
Discut, ie despre asocitativitate

Asociativitatea la dreapta pentru tipurile săgeată vs. asociativitatea


la stânga pentru aplicare:

• Să presupunem că f : ρ → (σ → τ), x : ρ s, i y : σ.


• Atunci f x : σ → τ s, i (f x ) y : τ.
• Folosind ambele convent, ii pentru asociativitate pentru a elimina
parantezele, avem
f :ρ → σ → τ
f x y :τ
Convent, iile pentru asociativitate sunt în armonie una cu cealaltă.

7
Church-typing vs. Curry-typing

A găsi tipul unui termen începe cu a găsi tipurile pentru variabile.


Există două metode prin care putem asocia tipuri variabilelor.

Asociere explicită (Church-typing).


• Constă în prescrierea unui unic tip pentru fiecare variabilă, la
introducerea acesteia.
• Presupune că tipurile variabilelor sunt explicit stabilite.
• Tipurile termenilor mai complecs, i se obt, in natural, t, inând cont de
convent, iile pentru aplicare s, i abstractizare.

Asociere implicită (Curry-typing).


• Constă în a nu prescriere un tip pentru fiecare variabilă, ci în a le
lăsa "deschise" (implicite).
• În acest caz, termenii typeable sunt descoperit, i printr-un proces
de căutare, care poate presupune "ghicirea" anumitor tipuri.
8
Church-typing vs. Curry-typing

Exemplu. Asociere explicită (Church-typing).

Vrem să calculăm tipul expresiei (λzu. z ) (y x ) s, tiind că


1. x : α → α
Aplicare. Dacă M : σ → τ s, i N : σ,
2. y : (α → α) → β atunci M N : τ.
3. z : β Abstractizare. Dacă x : σ s, i M : τ,
4. u : γ atunci λx . M : σ → τ.

9
Church-typing vs. Curry-typing

Exemplu. Asociere explicită (Church-typing).

Vrem să calculăm tipul expresiei (λzu. z ) (y x ) s, tiind că


1. x : α → α
Aplicare. Dacă M : σ → τ s, i N : σ,
2. y : (α → α) → β atunci M N : τ.
3. z : β Abstractizare. Dacă x : σ s, i M : τ,
4. u : γ atunci λx . M : σ → τ.
Din (2) s, i (1), prin aplicare obt, inem (5): y x : β.

Din (4) s, i (3), prin abstractizare obt, inem (6): λu. z : γ → β.

Din (3) s, i (6), prin abstractizare obt, inem (7): λzu. z : β → γ → β.


Nu uitat, i că β → γ → β înseamnă β → (γ → β).

Atunci, din (7) s, i (5), prin aplicare, avem (λzu. z ) (y x ) : γ → β.

9
Church-typing vs. Curry-typing

Exemplu. Asociere implicită (Curry-typing).

Considerăm termenul de mai devreme M = (λzu. z ) (y x ).

Putem să "ghicim" tipurile variabilelor astfel încât M să aibă tip?

Aplicare. Dacă M : σ → τ s, i N : σ, atunci M N : τ.

Abstractizare. Dacă x : σ s, i M : τ, atunci λx . M : σ → τ.

10
Church-typing vs. Curry-typing

Exemplu. Asociere implicită (Curry-typing).

Considerăm termenul de mai devreme M = (λzu. z ) (y x ).

Putem să "ghicim" tipurile variabilelor astfel încât M să aibă tip?

Aplicare. Dacă M : σ → τ s, i N : σ, atunci M N : τ.

Abstractizare. Dacă x : σ s, i M : τ, atunci λx . M : σ → τ.


• Observăm că M este o aplicare a lui λzu. z termenului y x.
• Atunci λzu. z trebuie să aibă un tip săgeată, de exemplu
λzu. z : A → B, s, i y x să se potrivească, adică y x : A .
• În acest caz, avem M : B.

10
Church-typing vs. Curry-typing

Exemplu. Asociere implicită (Curry-typing) (cont.)

S, tim M = (λzu. z ) (y x ) s, i am dedus până acum:

λzu. z : A → B y x :A M:B

• Faptul că λzu. z : A → B implică că z : A s, i λu. z : B.


• Deducem că B este tipul unei abstractizări, deci B ≡ C → D, s, i
obt, inem că u : C s, i z : D.
• Pe de altă parte, y x este o aplicare, deci trebuie să existe E s, i F
astfel încât y : E → F s, i x : E. Atunci y x : F.

11
Church-typing vs. Curry-typing

Exemplu. Asociere implicită (Curry-typing) (cont.)

S, tim M = (λzu. z ) (y x ). Am dedus următoarele:


• x :E
• y :E → F
• z : A s, i z : D, deci A ≡ D
• u:C
• B≡C→D
• y x : A s, i y x : F, deci A ≡ F.

În concluzie, A ≡ D ≡ F, s, i eliminând redundant, ele obt, inem


(∗) x :E y :E → A z:A u:C
Reamintim că aveam M : B, adică M : C → A .

Am obt, inut o schemă generală (∗) pentru tipurile lui x , y , z , u care


induc un tip pentru M. 12
Church-typing vs. Curry-typing

Exemplu. Asociere implicită (Curry-typing) (cont.)

S, tim M = (λzu. z ) (y x ). Am obt, inut schema generală

(∗) x :E y :E → A z:A u:C M:C → A

În schema de mai sus, putem considera tipuri "reale":

• x : β, y : β → α, z : α, u : δ, M : δ → α

13
Church-typing vs. Curry-typing

Exemplu. Asociere implicită (Curry-typing) (cont.)

S, tim M = (λzu. z ) (y x ). Am obt, inut schema generală

(∗) x :E y :E → A z:A u:C M:C → A

În schema de mai sus, putem considera tipuri "reale":

• x : β, y : β → α, z : α, u : δ, M : δ → α
• x : α → α, y : (α → α) → β, z : β, u : γ, M : γ → β
(solut, ia discutată la Church-typing)

13
Church-typing vs. Curry-typing

Exemplu. Asociere implicită (Curry-typing) (cont.)

S, tim M = (λzu. z ) (y x ). Am obt, inut schema generală

(∗) x :E y :E → A z:A u:C M:C → A

În schema de mai sus, putem considera tipuri "reale":

• x : β, y : β → α, z : α, u : δ, M : δ → α
• x : α → α, y : (α → α) → β, z : β, u : γ, M : γ → β
(solut, ia discutată la Church-typing)
• x : α, y : α → α → β, z : α → β, u : α → α,
M : (α → α) → α → β

13
Church-typing vs. Curry-typing

Asocierea implicită de tipuri (Curry-typing) are proprietăt, i


interesante, cum am văzut în exemplul anterior.

Totus, i, în continuare vom folosi asocierea explicită (Church-typing)


deoarece de obicei tipurile sunt cunoscute dinainte (s, i declararea
tipurilor pentru argumentele unei funct, ii este o bună-practică).

Marcăm tipurile variabilelor legate imediat după introducerea lor cu


o abstractizare. Tipurile variabilelor libere sunt date de un context.

14
Church-typing

Exemplu. Să considerăm exemplul anterior (λzu. z ) (y x ).

Observat, i că z s, i u sunt legate, iar x s, i y sunt libere.

Presupunând că z : β s, i u : γ, scriem termenul astfel


(λz : β. λu : γ. z ) (y x )

15
Church-typing

Exemplu. Să considerăm exemplul anterior (λzu. z ) (y x ).

Observat, i că z s, i u sunt legate, iar x s, i y sunt libere.

Presupunând că z : β s, i u : γ, scriem termenul astfel


(λz : β. λu : γ. z ) (y x )
Dacă presupunem un context în care despre variabilele libere s, tim,
de exemplu, că x : α → α s, i y : (α → α) → β, atunci folosim notat, ia:
x : α → α, y : (α → α) → β ⊢ (λz : β. λu : γ. z ) (y x )

15
Church-typing

Exemplu. Să considerăm exemplul anterior (λzu. z ) (y x ).

Observat, i că z s, i u sunt legate, iar x s, i y sunt libere.

Presupunând că z : β s, i u : γ, scriem termenul astfel


(λz : β. λu : γ. z ) (y x )
Dacă presupunem un context în care despre variabilele libere s, tim,
de exemplu, că x : α → α s, i y : (α → α) → β, atunci folosim notat, ia:
x : α → α, y : (α → α) → β ⊢ (λz : β. λu : γ. z ) (y x )
Încă nu avem o not, iune de β-reduct, ie pentru termeni cu tipuri, dar
ne-am putea gândi că am avea:
(λz : β. λu : γ. z ) (y x ) →β λu : γ. y x.
Observat, i că am dori să deducem că (λu : γ. y x ) : γ → β.

15
Sistem de deduct, ie pentru Church λ→

Deoarece am convenit cum să decorăm cu informat, ii despre tipuri


variabilele legate, trebuie să actualizăm definit, ia λ-termenilor.

Mult, imea λ-termenilor cu pre-tipuri ΛT este


ΛT = x | ΛT ΛT | λx : T. ΛT

O afirmat, ie este o expresie de forma M : σ, unde M ∈ ΛT s, i σ ∈ T.


Într-o astfel de afirmat, ie, M se numes, te subiect s, i σ tip.

O declarat, ie este o afirmat, ie în care subiectul este o variabilă (x : σ).

Un context este o listă de declarat, ii cu subiect, i diferit, i.

O judecată este o expresie de forma Γ ⊢ M : σ, unde Γ este context


s, i M : σ este o afirmat, ie.

16
Sistem de deduct, ie pentru Church λ→

Deoarece suntem în general interesat, i de termeni typeable, am dori


să avem o metodă prin care să putem stabili dacă un termen t ∈ ΛT
este typeable s, i dacă da, să calculăm un tip pentru t.

Vom da nis, te reguli care să ne permită să stabilim dacă o judecată
Γ ⊢ M : σ poate fi dedusă, adică dacă M are tipul σ în contextul Γ.

17
Sistem de deduct, ie pentru calculul Church λ→

dacă x : σ ∈ Γ (var )
Γ ⊢ x :σ

Γ ⊢ M : σ → τ Γ ⊢ N : σ (app )
Γ ⊢ MN:τ

Γ, x : σ ⊢ M : τ
(abs )
Γ ⊢ (λx : σ. M ) : σ → τ

Un termen M în calculul λ→ este legal dacă există un context Γ s, i


un tip ρ astfel încât Γ ⊢ M : ρ.

18
Sistem de deduct, ie pentru calculul Church λ→

Γ ⊢ M:σ → τ Γ ⊢ N:σ Γ, x : σ ⊢ M : τ
(var ) (app ) (abs )
Γ ⊢ x:σ Γ ⊢ M N:τ Γ ⊢ (λx : σ. M ) : σ → τ
dacă x : σ ∈ Γ

Exemplu. Să arătăm că termenul λy : α → β. λz : α. yz are tipul


(α → β) → α → β în contextul vid.

∅ ⊢ (λy : α → β. λz : α. yz ) : (α → β) → α → β

19
Sistem de deduct, ie pentru calculul Church λ→

Γ ⊢ M:σ → τ Γ ⊢ N:σ Γ, x : σ ⊢ M : τ
(var ) (app ) (abs )
Γ ⊢ x:σ Γ ⊢ M N:τ Γ ⊢ (λx : σ. M ) : σ → τ
dacă x : σ ∈ Γ

Exemplu. Să arătăm că termenul λy : α → β. λz : α. yz are tipul


(α → β) → α → β în contextul vid.

∅ ⊢ (λy : α → β. λz : α. yz ) : (α → β) → α → β

(var ) (var )
y : α → β, z : α ⊢ y : α → β y : α → β, z : α ⊢ z : α
(app )
y : α → β, z : α ⊢ (yz ) : β
(abs )
y : α → β ⊢ (λz : α. yz ) : α → β
(abs )
∅ ⊢ (λy : α → β. λz : α. yz ) : (α → β) → α → β

19
Diferite stiluri pentru a scrie deduct, ii

În exemplul anterior, am scris derivarea în stilul arbore.

În stilul liniar, derivarea precedentă ar arăta astfel:

1. y : α → β, z : α ⊢ y : α → β (var)
2. y : α → β, z : α ⊢ z : α (var)
3. y : α → β, z : α ⊢ (yz ) : β (app) cu 1 s, i 2
4. y : α → β ⊢ (λz : α. yz ) : α → β (abs) cu 3
5. ∅ ⊢ (λy : α → β. λz : α. yz ) : (α → β) → α → β (abs) cu 4

20
Diferite stiluri pentru a scrie deduct, ii

În stilul cu cutii, afis, ăm fiecare declarat, ie la începutul unei cutii s, i


considerăm că declarat, ia respectivă face parte din contextul pentru
toate afirmat, iile din cutia respectivă.

Când închidem o cutie, abstractizăm după variabila din declarat, ia


de la începutul cutiei.

(λy : α → β. λz : α. yz ) : (α → β) → α → β

21
Diferite stiluri pentru a scrie deduct, ii

În stilul cu cutii, afis, ăm fiecare declarat, ie la începutul unei cutii s, i


considerăm că declarat, ia respectivă face parte din contextul pentru
toate afirmat, iile din cutia respectivă.

Când închidem o cutie, abstractizăm după variabila din declarat, ia


de la începutul cutiei.

y :α → β (context )
(λz : α. yz ) : α → β
(λy : α → β. λz : α. yz ) : (α → β) → α → β (abs )

21
Diferite stiluri pentru a scrie deduct, ii

În stilul cu cutii, afis, ăm fiecare declarat, ie la începutul unei cutii s, i


considerăm că declarat, ia respectivă face parte din contextul pentru
toate afirmat, iile din cutia respectivă.

Când închidem o cutie, abstractizăm după variabila din declarat, ia


de la începutul cutiei.

y :α → β (context )
z:α (context )
(yz ) : β
(λz : α. yz ) : α → β (abs )
(λy : α → β. λz : α. yz ) : (α → β) → α → β (abs )

21
Diferite stiluri pentru a scrie deduct, ii

În stilul cu cutii, afis, ăm fiecare declarat, ie la începutul unei cutii s, i


considerăm că declarat, ia respectivă face parte din contextul pentru
toate afirmat, iile din cutia respectivă.

Când închidem o cutie, abstractizăm după variabila din declarat, ia


de la începutul cutiei.

1. y :α → β (context )
2. z:α (context )
3. (yz ) : β (app ) cu 1 s, i 2
4. (λz : α. yz ) : α → β (abs ) cu 3
5. (λy : α → β. λz : α. yz ) : (α → β) → α → β (abs ) cu 4

21
Sistem de deduct, ie pentru Church λ→

Exercit, iu. Arătăt, i că termenul λx : ((α → β) → α). x (λz : α. y ) are


tipul ((α → β) → α) → α în contextul y : β.

22
Quiz time!

https://tinyurl.com/2p9xf67e

23
Pe săptămâna viitoare!

24

S-ar putea să vă placă și