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: 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 M.Felleisen, M.Flatt, Programming Languages and Lambda Calculi, draft 2006, http://www.cs.utah.edu/plt/publications/pllc.pdf J.R.Hindley, J.P.Seldin, Lambda-Calculus and Combinators, an Introduction, Cambridge University Press, Cambridge 2008 M.H.Sørensen, P.Urzyczyn, Lectures on the Curry-Howard Isomorphism, Elsevier, Amsterdam 2006 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 a b 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 Γ, ϕ ϕ Γ ϕ (W ) Γ, ψ ϕ reguły wprowadzania reguły eliminacji Γ, ϕ ψ Γ ϕ ψ Γ, ϕ ( I) Γ ϕ Γ 1 ϕ ψ Γ 2 ϕ ( E) Γ 1, Γ 2 ψ Γ 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 ) Γ ϕ Γ ϕ Γ ϕ ψ ( I 1 ) Γ ϕ ψ ( E2 ) Γ ψ Γ ψ ( I 2 ) Γ ϕ ψ ( I) brak Γ 1 ϕ ψ Γ 2, ϕ ρ Γ 3, ψ ρ ( E) Γ 1, Γ 2, Γ 3 ρ 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 ϕ Γ, ϕ (RAA) Γ ϕ dla logiki klasycznej lub Γ ϕ ( ) Γ ϕ lub ϕ ϕ (T ND) (RAA) reductio ad absurdum (reguła sprowadzenia do sprzeczności) (T ND) 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 wprowadzania reguły eliminacji ϕ ψ ( I) ϕ ψ ϕ ψ ( E1 ) ϕ ϕ ψ ( E2 ) ψ ϕ ϕ ψ ( I 1 ) ψ ϕ ψ ( I 2 ) ϕ ψ [ϕ] n. ρ ρ [ψ] n. ρ n( E) ( I) brak 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 reguły eliminacji [ϕ] n. ψ ϕ ψ [ϕ] n. ϕ n n ( I) ϕ ψ ϕ ( E) ψ ϕ ϕ ( E) 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 wprowadzania reguły eliminacji [ϕ] n. ψ ϕ ψ [ψ] n. ϕ n( I) ϕ ψ ϕ ( E1) ψ dla logiki klasycznej ϕ ψ ψ ( E2) ϕ [ ϕ] n. lub ϕ ( ) ϕ lub ϕ ϕ ϕ n(raa) (RAA) reductio ad absurdum (reguła sprowadzenia do sprzeczności) (T ND) tertium non datur (reguła wykluczonego środka) ( ) reguła podwójnego zaprzeczenia (T ND) Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi 10
Dedukcja naturalna dla rachunku zdań Prawo sylogizmu hipotetycznego: (ϕ ψ) (ψ ρ) ϕ ρ Notacja sekwentowa. ϕ ψ ϕ ψ ϕ ϕ ( 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. [ϕ ψ] 2 [ϕ] 3 [ψ ρ] 1 ( E) ψ ρ ( E) 3 ϕ ρ 1 (ψ ρ) ϕ ρ 2 (ϕ ψ) (ψ ρ) ϕ ρ Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi 12
Dedukcja naturalna dla rachunku zdań Prawo importacji: (ϕ ψ ρ) (ϕ ψ ρ) Notacja sekwentowa. p q p q ( E) p q r p q r p q p p q p q ( E) ( E) p q r, p q q r p q q ( E) p q r, p q r p q r p q r (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. [ϕ ψ] 1 [ϕ ψ ρ] 2 ( E) ϕ ( E) ψ ρ ρ ϕ ψ ρ 1 (ϕ ψ ρ) (ϕ ψ ρ) [ϕ ψ] 1 ( E) ψ ( E) 2 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 Γ {x 1 : σ 1,..., x n : σ 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 : τ Γ M : τ Γ, x : σ M : τ (W) Γ, x : σ M : τ Γ λx.m : σ τ Γ 1 M : σ τ Γ 2 N : σ ( E) Γ 1, Γ 2 MN : τ 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 : ψ λ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 formułami i typami 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: (ϕ ψ) (ψ ρ) ϕ ρ g : ϕ ψ g : ϕ ψ x : ϕ x : ϕ ( E) f : ψ ρ f : ψ ρ g : ϕ ψ, x : ϕ gx : ψ ( E) f : ψ ρ, g : ϕ ψ, x : ϕ f(gx) : ρ f : ψ ρ, g : ϕ ψ λx.f(gx) : ϕ ρ g : ϕ ψ λfx.f(gx) : (ψ ρ) ϕ ρ λgfx.f(gx) : (ϕ ψ) (ψ ρ) ϕ ρ 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 f : ϕ ϕ f : ϕ ϕ (W ) f : ϕ ϕ, x : ψ f : ϕ ϕ f : ϕ ϕ λx.f : ψ ϕ ϕ y : ϕ y : ϕ λfx.f : (ϕ ϕ) ψ ϕ ϕ λy.y : ϕ ϕ ( E) (λfx.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 ψ ϕ ϕ. y : ϕ y : ϕ (W ) x : ψ, y : ϕ y : ϕ x : ψ λy.y : ϕ ϕ λ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 x : σ x : σ D 1, x : σ M : τ D 2 λx.m : σ τ Γ N : σ ( E) Γ, (λx.m)n : τ β D 2 Γ N : σ D 1[x := N] Γ, M[x := N] : τ Bezpośrednio po regule wprowadzania została użyta reguła eliminacji ( E). D Γ M : σ τ x : σ x : σ ( E) Γ, x : σ Mx : τ Γ λx.mx : σ τ Bezpośrednio po regule eliminacji ( E) została użyta reguła wprowadzania. Zakładamy, że x 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 : σ τ] [z : σ] ( E) yz : τ [v : τ ξ] [u : τ] ( E) vu : ξ λu.vu : τ ξ [x : σ τ ξ] [z : σ] ( E) λvu.vu : (τ ξ) τ ξ xz : τ ξ ( E) (λvu.vu)(xz) : τ ξ D (λvu.vu)(xz)(yz) : ξ λz.(λvu.vu)(xz)(yz) : σ ξ λ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 : σ τ] [z : σ] yz : τ ( E) [v : τ ξ] [x : σ τ ξ] [z : σ] ( E) λv.v : (τ ξ) τ ξ xz : τ ξ ( E) (λv.v)(xz) : τ ξ D (λv.v)(xz)(yz) : ξ λz.(λv.v)(xz)(yz) : σ ξ λ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 : σ τ] [z : σ] yz : τ ( E) [x : σ τ ξ] [z : σ] ( E) xz : τ ξ D ( E) xz(yz) : ξ λz.xz(yz) : σ ξ λ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 Γ {x 1 : σ 1,..., x n : σ 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 : τ Γ M : τ Γ, x : σ M : τ (W) Γ, x : σ M : τ Γ λx.m : σ τ Γ 1 M : σ τ Γ 2 N : σ ( E) Γ 1, Γ 2 MN : τ Γ M : ϕ N : ψ ( I) Γ, pair MN : ϕ ψ Γ M : ϕ ψ ( E1 ) Γ fst M : ϕ Γ M : ϕ ψ ( E2 ) Γ snd M : ψ 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 : ϕ ψ ( I 1 ) Γ M : ψ Γ inr M : ϕ ψ ( I 2 ) Γ M : ϕ ψ 1, x : ϕ P : ρ 2, x : ψ Q : ρ ( E) Γ, 1, 2 when M(λx.P )(λx.q) : ρ Γ M : Γ absurde M : τ ( E) Γ, x : σ M : ( I) Γ neg λx.m : σ Γ 1 M : σ Γ 2 N : σ ( E) Γ 1, Γ 2 nege MN : Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi 27
Rachunek lambda z typami prostymi λ Reguły redukcji dla λ (λx.m)n M[x := N] fst(pair MN) M snd(pair MN) N when(inl M)P Q P M when(inr M)P Q QM nege(neg M)N MN Zdzisław Spławski: Programowanie funkcyjne, Wykład 14. Rachunek λ z typami prostymi 28
Przykłady dla λ Prawo importacji: (ϕ ψ ρ) (ϕ ψ ρ) Notacja sekwentowa. D= x : p q x : p q x : p q snd x : q ( E) 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 f : p q r λx.f(fst x)(snd x) : p q r λf.λx.f(fst x)(snd x) : (p q r) (p q r) 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) [f : ϕ ψ ρ] fst x : ϕ [x : ϕ ψ] ( E) ( E) f(fst x) : ψ ρ snd x : ψ ( E) f(fst x)(snd x) : ρ λx.f(fst x)(snd x) : ϕ ψ ρ λ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) : ρ λy.f(pair x y) : ψ ρ λxy.f(pair x y) : ϕ ψ ρ λfxy.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 Podstawianie. Jeśli Γ, x : σ M : τ oraz Γ N : σ, to Γ M[x := N] : τ. Poprawność redukcji. Jeśli Γ M : τ oraz M βη N, to Γ N : τ. Silna normalizacja. Jeśli Γ M : τ to term M jest silnie normalizowalny. 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