Programowanie funkcyjne - Wykład 14. Rachunek z typami prostymi

Transkrypt

Programowanie funkcyjne - Wykład 14. Rachunek z typami prostymi
Programowanie funkcyjne
Wykład 14. Rachunek λ z typami prostymi
Zdzisław Spławski
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
1
Dowody konstruktywne
Dedukcja naturalna dla rachunku zdań
Rachunek lambda z typami prostymi λ→
Izomorfizm Curry’ego-Howarda
Rachunek lambda z typami prostymi λ→∧∨⊥¬
Przykłady dla λ→∧∨⊥¬
Własności rachunku lambda z typami prostymi
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
2
Materiały do tego wykładu zawierają głównie przykłady.
Definicje pojęć, twierdzenia i dowody można znaleźć np. tutaj:
I H.P.Barendregt, Lambda Calculi with Types, w:
S.Abramsky, Dov M. Gabbay, T.S.E. Maibaum, Handbook
of Logic in Computer Science, vol. 2, Clarendon Press,
Oxford 1992, pp. 117-309,
http://www.cs.ru.nl/˜henk/papers.html
I M.Felleisen, M.Flatt, Programming Languages and Lambda
Calculi, draft 2006,
http://www.cs.utah.edu/plt/publications/pllc.pdf
I J.R.Hindley, J.P.Seldin, Lambda-Calculus and Combinators,
an Introduction, Cambridge University Press, Cambridge
2008
I M.H.Sørensen, P.Urzyczyn, Lectures on the Curry-Howard
Isomorphism, Elsevier, Amsterdam 2006
I P.Urzyczyn, Rachunek lambda, wykład monograficzny,
http://www.mimuw.edu.pl/˜urzy/Lambda/
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
3
Dowody konstruktywne
Twierdzenie. Istnieją dwie niewymierne liczby a i b takie, że ab
jest wymierne. √ √
√
Dowód.
Albo ( 2) 2 jest wymierne i wtedy√ a = b = 2 albo
√ √2
√
√
( 2) jest niewymierne i wtedy a = ( 2) 2 , b = 2.
Dowód tego twierdzenie jest oczywiście poprawny w logice klasycznej.
Jest to przykład dowodu niekonstruktywnego, ze względu na
wykorzystanie reguły wykluczonego środka. Pomimo, że twierdzenie
jest dowiedzione i wiadomo, że liczby a i b istnieją, to nie można (na
podstawie dowodu) znaleźć pary liczb spełniających warunek
określony w twierdzeniu. Konstruktywny dowód tego twierdzenia jest
oparty na twierdzeniu Gelfonda–Schneidera.Wynika z niego, że liczby
√
a = b = 2 spełniają powyższe twierdzenie.
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
4
Dedukcja naturalna dla rachunku zdań
Reguły wnioskowania w notacji sekwentowej I
Γ, ϕ ` ϕ
(Ass)
Γ`ϕ
(W )
Γ, ψ ` ϕ
reguły wprowadzania
reguły eliminacji
Γ, ϕ ` ψ
(→ I)
Γ`ϕ→ψ
Γ1 ` ϕ → ψ
Γ2 ` ϕ
(→ E)
Γ1 , Γ2 ` ψ
Γ, ϕ ` ⊥
(¬I)
Γ ` ¬ϕ
Γ1 ` ¬ϕ
Γ2 ` ϕ
(¬E)
Γ1 , Γ2 ` ⊥
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
5
Dedukcja naturalna dla rachunku zdań
Reguły wnioskowania w notacji sekwentowej II
reguły wprowadzania
reguły eliminacji
Γ1 ` ϕ
Γ2 ` ψ
(∧I)
Γ1 , Γ2 ` ϕ ∧ ψ
Γ`ϕ∧ψ
(∧E1 )
Γ`ϕ
Γ`ϕ∧ψ
(∧E2 )
Γ`ψ
Γ`ϕ
(∨I1 )
Γ`ϕ∨ψ
Γ`ψ
(∨I2 )
Γ`ϕ∨ψ
`>
(>I)
brak
Γ1 ` ϕ ∨ ψ
Γ2 , ϕ ` ρ
Γ1 , Γ2 , Γ3 ` ρ
Γ3 , ψ ` ρ
(∨E)
brak
Γ ` ⊥ (⊥E)
Γ`ϕ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
6
Dedukcja naturalna dla rachunku zdań
Reguły wnioskowania w notacji sekwentowej III
reguły wprowadzania
reguły eliminacji
Γ1 , ϕ ` ψ
Γ2 , ψ ` ϕ
(↔I)
Γ1 , Γ2 ` ϕ ↔ ψ
Γ1 ` ϕ ↔ ψ
Γ2 ` ϕ
(↔E1 )
Γ1 , Γ2 ` ψ
Γ1 ` ϕ ↔ ψ
Γ2 ` ψ
(↔E2 )
Γ1 , Γ2 ` ϕ
dla logiki klasycznej
Γ, ¬ϕ ` ⊥
(RAA) lub
Γ`ϕ
Γ ` ¬¬ϕ
(¬¬) lub
Γ`ϕ
` ϕ ∨ ¬ϕ
(T N D)
(RAA) — reductio ad absurdum (reguła sprowadzenia do sprzeczności)
(T N D) — tertium non datur (reguła wykluczonego środka)
(¬¬) — reguła podwójnego zaprzeczenia
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
7
Dedukcja naturalna dla rachunku zdań
Reguły wnioskowania w notacji założeniowej I
reguły eliminacji
reguły wprowadzania
ϕ
ψ
(∧I)
ϕ∧ψ
ϕ
(∨I1 )
ϕ∨ψ
>
ψ
(∨I2 )
ϕ∨ψ
(>I)
brak
ϕ∧ψ
(∧E1 )
ϕ
ϕ∨ψ
ϕ∧ψ
(∧E2 )
ψ
[ϕ]n
..
.
ρ
ρ
[ψ]n
..
.
ρ
n (∨E)
brak
⊥ (⊥E)
ϕ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
8
Dedukcja naturalna dla rachunku zdań
Reguły wnioskowania w notacji założeniowej II
reguły wprowadzania
[ϕ]n
..
.
ψ
ϕ→ψ
[ϕ]n
..
.
⊥
¬ϕ
reguły eliminacji
ϕ→ψ
ψ
n (→
ϕ
(→ E)
I)
¬ϕ
ϕ
⊥
(¬E)
n (¬I)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
9
Dedukcja naturalna dla rachunku zdań
Reguły wnioskowania w notacji założeniowej III
reguły eliminacji
reguły wprowadzania
[ϕ]n
[ψ]n
..
.
ψ
..
.
ϕ
ϕ↔ψ
ϕ↔ψ
ψ
n (↔
ϕ
(↔ E1 )
ϕ↔ψ
ϕ
ψ
(↔ E2 )
I)
dla logiki klasycznej
[¬ϕ]n
..
¬¬ϕ
(T N D)
lub
lub
ϕ ∨ ¬ϕ
.
ϕ (¬¬)
⊥ (RAA)
ϕ n
(RAA) — reductio ad absurdum (reguła sprowadzenia do sprzeczności)
(T N D) — tertium non datur (reguła wykluczonego środka)
(¬¬) — reguła podwójnego zaprzeczenia
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
10
Dedukcja naturalna dla rachunku zdań
Prawo sylogizmu hipotetycznego:
` (ϕ → ψ) → (ψ → ρ) → ϕ → ρ
Notacja sekwentowa.
(Ass)
ϕ→ψ`ϕ→ψ
ψ→ρ`ψ→ρ
ϕ → ψ, ϕ ` ψ
ψ → ρ, ϕ → ψ, ϕ ` ρ
(→ I)
ψ → ρ, ϕ → ψ ` ϕ → ρ
(→ I)
ϕ → ψ ` (ψ → ρ) → ϕ → ρ
(→ I)
` (ϕ → ψ) → (ψ → ρ) → ϕ → ρ
(Ass)
ϕ`ϕ
(Ass)
(→ E)
(→ E)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
11
Dedukcja naturalna dla rachunku zdań
Prawo sylogizmu hipotetycznego:
` (ϕ → ψ) → (ψ → ρ) → ϕ → ρ
Notacja założeniowa.
[ψ → ρ]1
[ϕ → ψ]2
ψ
[ϕ]3
(→ E)
(→ E)
ρ
ϕ → ρ 3 (→ I)
1 (→ I)
(ψ → ρ) → ϕ → ρ
2 (→ I)
(ϕ → ψ) → (ψ → ρ) → ϕ → ρ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
12
Dedukcja naturalna dla rachunku zdań
Prawo importacji: ` (ϕ → ψ → ρ) → (ϕ ∧ ψ → ρ)
Notacja sekwentowa.
(Ass)
(Ass)
p∧q `p∧q
(∧E)
p∧q `p
(→ E)
(Ass)
p→q→r`p→q→r
p∧q `p∧q
(∧E)
p → q → r, p ∧ q ` q → r
p∧q `q
(→ E)
p → q → r, p ∧ q ` r
(→ I)
p→q →r `p∧q →r
(→ I)
` (p → q → r) → (p ∧ q → r)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
13
Dedukcja naturalna dla rachunku zdań
Prawo importacji: ` (ϕ → ψ → ρ) → (ϕ ∧ ψ → ρ)
Notacja założeniowa.
ρ]2
[ϕ → ψ →
ψ→ρ
[ϕ ∧ ψ]1
ϕ
(∧E)
(→ E)
[ϕ ∧ ψ]1
ψ
ρ
1 (→ I)
ϕ∧ψ →ρ
(ϕ → ψ → ρ) → (ϕ ∧ ψ → ρ)
(∧E)
(→ E)
2 (→
I)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
14
Rachunek lambda z typami prostymi λ→
Relacja typizująca
Γ`M :τ
gdzie Γ oznacza kontekst typizujący
Γ ≡ {x1 : σ1 , . . . , xn : σn }
w którym każda zmienna występuje co najwyżej raz.
Γ ` M : τ można czytać “w kontekście Γ term M ma typ τ ”.
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
15
Rachunek lambda z typami prostymi λ→
Reguły typizacji. Wersja 1: notacja sekwentowa
Γ, x : τ ` x : τ
(Ass)
Γ`M :τ
Γ, x : σ ` M : τ
Γ, x : σ ` M : τ
Γ ` λx.M : σ → τ
(W)
(→ I)
Γ1 ` M : σ → τ
Γ2 ` N : σ
Γ1 , Γ2 ` M N : τ
(→ E)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
16
Rachunek lambda z typami prostymi λ→
Reguły typizacji. Wersja 2: notacja założeniowa
reguła wprowadzania
reguła eliminacji
[x : ϕ]
..
.
M :ψ
(→ I)
λx.M : ϕ → ψ
M :ϕ→ψ
N :ϕ
(→ E)
MN : ψ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
17
Izomorfizm Curry’ego-Howarda
Termin “izomorfizm Curry’ego-Howarda” oznacza ścisłą
odpowiedniość pomiędzy
I
formułami i typami
I
dowodami i termami (programami)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
18
Izomorfizm Curry’ego-Howarda
Prawo sylogizmu hipotetycznego:
` (ϕ → ψ) → (ψ → ρ) → ϕ → ρ
(Ass)
(Ass)
g:ϕ→ψ`g:ϕ→ψ
x:ϕ`x:ϕ
(→ E)
f :ψ→ρ`f :ψ→ρ
g : ϕ → ψ, x : ϕ ` gx : ψ
(→ E)
f : ψ → ρ, g : ϕ → ψ, x : ϕ ` f (gx) : ρ
(→ I)
f : ψ → ρ, g : ϕ → ψ ` λx.f (gx) : ϕ → ρ
(→ I)
g : ϕ → ψ ` λf x.f (gx) : (ψ → ρ) → ϕ → ρ
(→ I)
` λgf x.f (gx) : (ϕ → ψ) → (ψ → ρ) → ϕ → ρ
(Ass)
Prawo sylogizmu hipotetycznego = składanie funkcji
Niech będą dane dwie funkcje f : ψ → ρ oraz g : ϕ → ψ. Złożenie (f ◦ g) : ϕ → ρ
jest definiowane następująco (patrz wykład 3):
(f ◦ g)(x) = f (gx)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
19
Izomorfizm Curry’ego-Howarda
(Ass)
f :ϕ→ϕ`f :ϕ→ϕ
(W )
f : ϕ → ϕ, x : ψ ` f : ϕ → ϕ
(→ I)
(Ass)
f : ϕ → ϕ ` λx.f : ψ → ϕ → ϕ
y:ϕ`y:ϕ
(→ I)
(→ I)
` λy.y : ϕ → ϕ
` λf x.f : (ϕ → ϕ) → ψ → ϕ → ϕ
(→ E)
` (λf x.f )(λy.y) : ψ → ϕ → ϕ
Przedstawione drzewo wywodu nie jest najprostsze. Wykorzystano
założenie f : ϕ → ϕ. Jednak w prawym poddrzewie rzeczywiście
udowodniliśmy ϕ → ϕ, wobec tego założenie f : ϕ → ϕ właściwie nie
było potrzebne. W efekcie otrzymany λ-term zawiera β-redeks. Niżej
przedstawiono najkrótszy dowód ψ → ϕ → ϕ.
(Ass)
y:ϕ`y:ϕ
(W )
x : ψ, y : ϕ ` y : ϕ
(→ I)
x : ψ ` λy.y : ϕ → ϕ
(→ I)
` λxy.y : ψ → ϕ → ϕ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
20
Izomorfizm Curry’ego-Howarda
Normalizacja (upraszczanie) dowodów ≈ redukcja termów
(Ass)
x:σ`x:σ
D1
∆, x : σ ` M : τ
D2
(→ I)
∆ ` λx.M : σ → τ
Γ ` N : σ (→ E)
Γ, ∆ ` (λx.M )N : τ
→β
D2
Γ`N :σ
D1 [x := N ]
Γ, ∆ ` M [x := N ] : τ
Bezpośrednio po regule wprowadzania (→ I)
została użyta reguła eliminacji (→ E).
D
(Ass)
x : σ ` x : σ (→ E)
Γ`M :σ→τ
→η
Γ, x : σ ` M x : τ
(→ I)
Γ ` λx.M x : σ → τ
Bezpośrednio po regule eliminacji (→ E)
została użyta reguła wprowadzania (→ I).
Zakładamy, że x 6∈ F V (M ).
D
Γ`M :σ→τ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
21
Izomorfizm Curry’ego-Howarda
Przykład (bardziej skomplikowany)
D= [y : σ → τ ]
yz : τ
[z : σ]
(→ E)
[v : τ → ξ]
[u : τ ]
(→ E)
vu : ξ
(→ I)
λu.vu : τ → ξ
[x : σ → τ → ξ]
[z : σ]
(→ I)
(→ E)
xz : τ → ξ
λvu.vu : (τ → ξ) → τ → ξ
(→ E)
(λvu.vu)(xz) : τ → ξ
D
(λvu.vu)(xz)(yz) : ξ
(→ I)
λz.(λvu.vu)(xz)(yz) : σ → ξ
(→ I)
λyz.(λvu.vu)(xz)(yz) : (σ → τ ) → σ → ξ
λxyz.(λvu.vu)(xz)(yz) : (σ → τ → ξ) → (σ → τ ) → σ → ξ
W otrzymanym λ-termie są zawarte dwa redeksy: η-redeks λvu.vu oraz
β-redeks (λv.M )(xz). Po redukcji otrzymamy term λxyz.xz(yz).
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
22
Izomorfizm Curry’ego-Howarda
Przykładowy wywód po zastosowaniu →η
D= [y : σ → τ ]
yz : τ
[z : σ]
(→ E)
[v : τ → ξ]
[x : σ → τ → ξ]
[z : σ]
(→ I)
(→ E)
xz : τ → ξ
λv.v : (τ → ξ) → τ → ξ
(→ E)
(λv.v)(xz) : τ → ξ
D
(λv.v)(xz)(yz) : ξ
(→ I)
λz.(λv.v)(xz)(yz) : σ → ξ
(→ I)
λyz.(λv.v)(xz)(yz) : (σ → τ ) → σ → ξ
λxyz.(λv.v)(xz)(yz) : (σ → τ → ξ) → (σ → τ ) → σ → ξ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
23
Izomorfizm Curry’ego-Howarda
Przykładowy wywód po zastosowaniu →β
D= [y : σ → τ ]
yz : τ
[z : σ]
(→ E)
[x : σ → τ → ξ]
xz : τ → ξ
[z : σ]
(→ E)
D
(→ E)
xz(yz) : ξ
(→ I)
λz.xz(yz) : σ → ξ
(→ I)
λyz.xz(yz) : (σ → τ ) → σ → ξ
λxyz.xz(yz) : (σ → τ → ξ) → (σ → τ ) → σ → ξ
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
24
Rachunek lambda z typami prostymi λ→∧∨⊥¬
Relacja typizująca
Γ`M :τ
gdzie Γ oznacza kontekst typizujący
Γ ≡ {x1 : σ1 , . . . , xn : σn }
w którym każda zmienna występuje co najwyżej raz.
Γ ` M : τ można czytać “w kontekście Γ term M ma typ τ ”.
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
25
Rachunek lambda z typami prostymi λ→∧∨⊥¬
Reguły typizacji. Notacja sekwentowa
Γ, x : τ ` x : τ
(Ass)
Γ`M :τ
Γ, x : σ ` M : τ
Γ, x : σ ` M : τ
Γ ` λx.M : σ → τ
(→ I)
Γ1 ` M : σ → τ
Γ2 ` N : σ
Γ1 , Γ2 ` M N : τ
Γ`M :ϕ
∆`N :ψ
Γ, ∆ ` pair M N : ϕ ∧ ψ
Γ`M :ϕ∧ψ
Γ ` fst M : ϕ
(∧E1 )
(W)
(→ E)
(∧I)
Γ`M :ϕ∧ψ
Γ ` snd M : ψ
(∧E2 )
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
26
Rachunek lambda z typami prostymi λ→∧∨⊥¬
Reguły typizacji. Notacja sekwentowa
Γ`M :ϕ
Γ ` inl M : ϕ ∨ ψ
(∨I1 )
Γ`M :ψ
Γ ` inr M : ϕ ∨ ψ
(∨I2 )
Γ`M :ϕ∨ψ
∆1 , x : ϕ ` P : ρ
∆2 , x : ψ ` Q : ρ
Γ, ∆1 , ∆2 ` when M (λx.P )(λx.Q) : ρ
Γ`M :⊥
Γ ` absurdE M : τ
(⊥E)
Γ, x : σ ` M : ⊥
Γ ` neg λx.M : ¬σ
(¬I)
Γ1 ` M : ¬σ
Γ2 ` N : σ
Γ1 , Γ2 ` negE M N : ⊥
(∨E)
(¬E)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
27
Rachunek lambda z typami prostymi λ→∧∨⊥¬
Reguły redukcji dla λ→∧∨⊥¬
I
(λx.M )N → M [x := N ]
I
fst(pair M N ) → M
I
snd(pair M N ) → N
I
when(inl M )P Q → P M
I
when(inr M )P Q → QM
I
negE(neg M )N → M N
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
28
Przykłady dla λ→∧∨⊥¬
Prawo importacji: ` (ϕ → ψ → ρ) → (ϕ ∧ ψ → ρ)
Notacja sekwentowa.
(Ass)
D= x : p ∧ q ` x : p ∧ q
(∧E)
x : p ∧ q ` snd x : q
(Ass)
x:p∧q `x:p∧q
(∧E)
f :p→q→r`f :p→q→r
x : p ∧ q ` fst x : p
(→ E)
f : p → q → r, x : p ∧ q ` f (fst x) : q → r
D
f : p → q → r, x : p ∧ q ` f (fst x)(snd x) : r
(→ I)
f : p → q → r ` λx.f (fst x)(snd x) : p ∧ q → r
(→ I)
` λf.λx.f (fst x)(snd x) : (p → q → r) → (p ∧ q → r)
(Ass)
Prawo importacji = zwijanie funkcji
(patrz wykład 3, funkcja uncurry)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
29
Przykłady dla λ→∧∨⊥¬
Prawo importacji: ` (ϕ → ψ → ρ) → ϕ ∧ ψ → ρ
Notacja założeniowa.
[x : ϕ ∧ ψ]
(∧E)
fst x : ϕ
[f : ϕ → ψ → ρ]
[x : ϕ ∧ ψ]
(→ E)
(∧E)
f (fst x) : ψ → ρ
snd x : ψ
(→ E)
f (fst x)(snd x) : ρ
(→ I)
λx.f (fst x)(snd x) : ϕ ∧ ψ → ρ
(→ I)
λf λx.f (fst x)(snd x) : (ϕ → ψ → ρ) → ϕ ∧ ψ → ρ
Prawo importacji = zwijanie funkcji
(patrz wykład 3, funkcja uncurry)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
30
Przykłady dla λ→∧∨⊥¬
Prawo eksportacji: ` (ϕ ∧ ψ → ρ) → ϕ → ψ → ρ
[x : ϕ]
[y : ψ]
(∧I)
[f : ϕ ∧ ψ → ρ]
pair x y : ϕ ∧ ψ
(→ E)
f (pair x y) : ρ
(→ I)
λy.f (pair x y) : ψ → ρ
(→ I)
λxy.f (pair x y) : ϕ → ψ → ρ
(→ I)
λf xy.f (pair x y) : (ϕ ∧ ψ → ρ) → ϕ → ψ → ρ
Prawo eksportacji = rozwijanie funkcji
(patrz wykład 3, funkcja curry)
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
31
Własności rachunku lambda z typami prostymi
I
Podstawianie. Jeśli Γ, x : σ ` M : τ oraz Γ ` N : σ, to
Γ ` M [x := N ] : τ .
I
Poprawność redukcji. Jeśli Γ ` M : τ oraz M βη N , to
Γ ` N : τ.
I
Silna normalizacja. Jeśli Γ ` M : τ to term M jest silnie
normalizowalny.
I
Typ główny (najogólniejszy). Jeśli term M jest typizowalny,
to istnieje dla niego typ główny, z którego można otrzymać
wszystkie typy tego termu (przez odpowiednie podstawienia
za zmienne przebiegające typy).
Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi
32

Podobne dokumenty