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