後半第4回「型付きλ計算と論理」 - ...koba/class/ComputationTheory/Computation... ·...

40
計算の理論 後半第4回「型付きλ計算と論理」

Transcript of 後半第4回「型付きλ計算と論理」 - ...koba/class/ComputationTheory/Computation... ·...

計算の理論 後半第4回「型付きλ計算と論理」

本日の内容

• 単純型つきλ計算(復習) • Curry-Howard同型

– 証明 = プログラム • 証明支援システム

単純型付きλ計算 • 構文

τ (型) ::= b | τ1→ τ2

b (基本型) ::= int | bool | ... M (項) ::= cb1→... → bk→b (定数)

| x | λx:τ.M | M1M2 • 簡約

β簡約 + 定数の簡約: cb1→... → bk→b c1

b1 ... ckbk → [c](c1,...,ck)

(ただし[c] はcが表す数学的な関数。 例えば [+] 1 2 = 3)

型判断(type judgment) • x1:τ1, ..., xn:τn |− M: τ

「型環境x1:τ1, ..., xn:τn のもとで項Mは型τを持つ」 「各変数xiが型τiの値に束縛されている下でMを評価すると、 評価結果はτ型の値になる」 e.g. f:int → int, x:int |− f x : int y:int |− +int→ int→int y 1int: int

• 次のスライドの「型付け規則」により定義

型環境(変数の有限集合から型集合への写像)

型付け規則

Γ(x)=τ −−−−−−−−−−−−−−−−−−

Γ┝ x:τ

Γ, x:τ1 ┝ M:τ2

−−−−−−−−−−−−−−−−−− Γ┝ λx:τ1.M: τ1 → τ2

Γ┝ M: τ1 → τ2 Γ┝ N: τ1 −−−−−−−−−−−−−−−−−−−−−−−−

Γ┝ M N: τ2

Γ┝ cτ:τ

単純型付きλ計算の性質 • 型の一意性

Γ |- M:τ かつΓ|-M:τ’ ならばτ=τ’ • 強正規化定理

Γ |- M:τ ならば無限簡約列M → M1 → M2 → M3 → ... は存在しない => 型なしλ計算やチューリングマシンに比べて表現力が劣る。

• 型保存(subject reduction) Γ |- M:τ かつM→ N ならば Γ |- N:τ 系: Γ |- M:τ かつ M →* C[(λx:σ.L)N] ならば、Nの型はσ (すなわち、関数が要求する引数の型と実際の引数の型は 一致する)

組型を加えた拡張 • 構文

τ (型) ::= b | τ1→ τ2 | τ1×τ2

b (基本型) ::= int | bool | ... M (項) ::= ... | (M1, M2) | fst(M) | snd(M)

• 簡約 ... fst(M1, M2) → M1

snd(M1, M2) → M2

• 型付け

Γ┝ M: τ1 Γ┝ N: τ2

−−−−−−−−−−−−−−−−−−−− Γ┝ (M, N): τ1 × τ2

Γ┝ M: τ1 × τ2

−−−−−−−−−−−−−−− Γ┝ fst(M): τ1

Γ┝ M: τ1 × τ2

−−−−−−−−−−−−−− Γ┝ snd(M): τ2

直和型を加えた拡張 • 構文

τ (型) ::= ... | τ1+τ2

M (項) ::= ... | inl(M) | inr(M) | case M0 of inl(x)=>M1 | inr(y)=>M2

• 簡約 case inl(M) of inl(x)=>M1 | inr(y)=>M2 → [M/x]M1

case inr(M) of inl(x)=>M1 | inr(y)=>M2 → [M/y]M2

• 型付け

Γ ┝ L: τ1+τ2 Γ,x: τ1 ┝ M: τ Γ,y: τ2 ┝ N: τ

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Γ┝ case L of inl(x)=>M | inr(y)=>N: τ

Γ┝ M: τ1

−−−−−−−−−−−−−−− Γ┝ inl(M): τ1+τ2

Γ┝ M: τ2

−−−−−−−−−−−−−−− Γ┝ inr(M): τ1+τ2

本日の内容

• 単純型つきλ計算(復習) • Curry-Howard同型

– 証明 = プログラム • 証明支援システム

型づけ規則から項を取り除くと...

Γ, x:A┝ x:A

Γ, x:A ┝ M:B

−−−−−−−−−−−−−−−−−− Γ┝ λx:A.M: A → B

Γ┝ M: A → B Γ┝ N: A

−−−−−−−−−−−−−−−−−−−−−−−− Γ┝ M N: B

Γ┝ cA:A

型づけ規則から項を取り除くと...

Γ, x:A┝ x:A

Γ, x:A ┝ M:B

−−−−−−−−−−−−−−−−−− Γ┝ λx:A.M: A → B

Γ┝ M: A → B Γ┝ N: A

−−−−−−−−−−−−−−−−−−−−−−−− Γ┝ M N: B

Γ┝ cA:A

論理の推論規則?

計算と論理の不思議な対応関係 (Curry-Howard同型)

計算の世界

プログラム

計算

型検査

論理の世界

命題

証明

証明の簡単化

証明の整合性の検査

Curry-Howardの対応による証明の表現 論理式 証明

A ∧ B

A ∨ B

A → B

Curry-Howardの対応による証明の表現 論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B

A → B

Curry-Howardの対応による証明の表現 論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B inl(Aの証明)またはinr(Bの証明)

A → B

Curry-Howardの対応による証明の表現

例. A → (B → (A∧B))の証明: = λx:A. 「 B → (A∧B)の証明」 = λx:A. λy:B. 「 A∧Bの証明」 = λx:A. λy:B. (「 Aの証明」, 「 Bの証明」) = λx:A. λy:B. (x, y)

論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B inl(Aの証明)またはinr(Bの証明)

A → B Aの証明をもらってBの証明を返す関数

Curry-Howardの対応による証明の表現

例. 「(A ∨ B) → (A → C) → (B → C) → Cの証明」 = λx: (A ∨ B). 「(A → C) → (B → C) → Cの証明」 = λx: (A ∨ B). λy: (A → C). 「 (B → C) → Cの証明」 = λx: (A ∨ B). λy: (A → C). λz: (B → C). 「 Cの証明」 = λx: (A ∨ B). λy: (A → C). λz: (B → C). case x of inl(u) => 「 Cの証明」 /* Aが成り立つ場合*/ | inr(v) => 「 Cの証明」 /* Bが成り立つ場合*/

論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B inl(Aの証明)またはinr(Bの証明)

A → B Aの証明をもらってBの証明を返す関数

Curry-Howardの対応による証明の表現

例. 「(A ∨ B) → (A → C) → (B → C) → Cの証明」 = λx: (A ∨ B). 「(A → C) → (B → C) → Cの証明」 = λx: (A ∨ B). λy: (A → C). 「 (B → C) → Cの証明」 = λx: (A ∨ B). λy: (A → C). λz: (B → C). 「 Cの証明」 = λx: (A ∨ B). λy: (A → C). λz: (B → C). case x of inl(u) => y(u) | inr(v) => z(v)

論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B inl(Aの証明)またはinr(Bの証明)

A → B Aの証明をもらってBの証明を返す関数

練習問題 • 以下の命題の証明をλ項で表せ

(1) A → A (2) A → ((A → B) → B) (3) (A ∧ B) → A (4) A → ¬¬A (5) ¬ ¬(A ∨ ¬A)

注: ¬A (Aの否定)は、A →False の略記とみなす

古典論理と直観主義論理

• A∨¬ A (排中律)の証明は存在しない ⇒通常の論理(古典論理)とは異なる

• 古典論理から排中律を取り除いた体系を 直観主義論理と呼ぶ

• 証明=プログラムの対応が素直に成り立つのは直観主義論理の体系

直観主義命題論理 • 命題

A,B ::= α (原子命題) | A→ B • 証明(自然演繹)

– Aa は、{Aa} ⇒ Aの証明 (aは異なるAの出現を区別する ためのラベル)

– Pが ∆1 ⇒ A → Bの証明、 Qが∆2 ⇒ A の証明なら E(P, Q) は∆1∪ ∆2 ⇒ Bの証明

– Pが∆∪{Aa} ⇒ Bの証明なら I(Aa,P) は ∆ ⇒ A → Bの証明

∆1 ... −−−−−− A → B

∆2 ... −− A −−−−−−−−−−−−

B

P Q E(P,Q)

Aa

∆ Aa Aa Ab ... −−−−−−−−−−−− B

P

−−−−−−−−−−−−a A → B

[ ] [ ]

I(Aa,P)

例:A→ (A → B) → Bの 自然演繹による証明

A A→B

B

例:A→ (A → B) → Bの 自然演繹による証明

A [A→B]

B (A→B)→B

例:A→ (A → B) → Bの 自然演繹による証明

[A] [A→B]

B (A→B)→B

A→(A→B)→B

λ項の存在と証明可能性 定理: 型Aの閉じた単純型付きλ項が存在する ⇔ Aが直観主義命題論理で証明可能

練習問題

• 前ページの定理を用いて ¬¬α → α (2重否定除去) が直観主義命題論理では証明できない ことを示せ (¬¬α = (α → False) → False )

解答例 • ¬¬α → αの導出(証明)が存在しないことの証明

直観主義論理における証明が存在すると仮定すると

¬¬α → αを型に持つ閉じたλ項Mが存在する。

強正規化定理と型保存定理より、 Mはβ標準形であると 仮定してよい。 したがって、M は λx: ¬ ¬ α. x N1 ... Nk の形である。 しかし、xの型より、 x N1 ... Nkの型はαではありえないので矛盾。

Curry-Howardの対応による証明の表現 論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B inl(Aの証明)またはinr(Bの証明)

A → B Aの証明をもらってBの証明を返す関数

∀x:S.P(x)

∃x:S.P(x)

Curry-Howardの対応による証明の表現 論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B inl(Aの証明)またはinr(Bの証明)

A → B Aの証明をもらってBの証明を返す関数

∀x:S.P(x) Sの要素xを引数としてP(x)の証明を返す関数

∃x:S.P(x)

Curry-Howardの対応による証明の表現 論理式 証明

A ∧ B (Aの証明, Bの証明)

A ∨ B inl(Aの証明)またはinr(Bの証明)

A → B Aの証明をもらってBの証明を返す関数

∀x:S.P(x) Sの要素xを引数としてP(x)の証明を返す関数

∃x:S.P(x) Sの要素aとP(a)の証明の組

例. (∀x:nat.x<x+1) → ∀y:nat. ∃z:nat.(y<z)の証明: = λp: (∀x:nat.x<x+1) .「∀y:nat. ∃z:nat.(y<z)の証明」 = λp: (∀x:nat.x<x+1) . λy:nat. 「∃z:nat.(y<z)の証明」 = λp: (∀x:nat.x<x+1) . λy:nat. (y+1, 「y<y+1の証明」) = λp: (∀x:nat.x<x+1) . λy:nat. (y+1, p y)

練習問題 • 以下の証明をλ項で表せ

(∀x:nat.x<x+1) → ((∀x:nat.∀y:nat.∀z:nat.(x<y∧y<z → x<z)) → ∀x:nat. x < (x+1)+1)

証明とプログラム抽出 ∀x:S.∃y:T.P(x,y) の証明: λx:S. (e, “P(x,e) の証明”) P(x,e)の証明部分を除いて得られる λx:S. e は、型Sの値aを受け取ってP(a,b)を満たすbを返す関数 例:∀x: nat list.∃y: nat list.

(sorted(y) ∧ permutation(x,y)) を証明すれば、その証明からソーティング関数を抽出できる!

本日の内容

• 単純型つきλ計算(復習) • Curry-Howard同型

– 証明 = プログラム • 証明支援システム

定理証明支援器 (Coq, Isabelle/HOL, Agda, ...)

• 対象(数、関数、データ、プログラムなど)や その性質を表す命題およびその証明を形式的に記述するための言語を提供

• 証明の正しさを機械的に検査

• 証明を行う手助け(半自動証明)

• 証明からプログラムを抽出

定理証明支援器 (Coq, Isabelle/HOL, Agda, ...)

• 対象(数、関数、データ、プログラムなど)や その性質を表す命題およびその証明を形式的に記述するための言語を提供

• 証明の正しさを機械的に検査

• 証明を行う手助け(半自動証明)

• 証明からプログラムを抽出

型付きλ計算!

定理証明支援器 (Coq, Isabelle/HOL, Agda, ...)

• 対象(数、関数、データ、プログラムなど)や その性質を表す命題およびその証明を形式的に記述するための言語を提供

• 証明の正しさを機械的に検査

• 証明を行う手助け(半自動証明)

• 証明からプログラムを抽出

型付きλ計算!

型検査

定理証明支援器 (Coq, Isabelle/HOL, Agda, ...)

• 対象(数、関数、データ、プログラムなど)や その性質を表す命題およびその証明を形式的に記述するための言語を提供

• 証明の正しさを機械的に検査

• 証明を行う手助け(半自動証明)

• 証明からプログラムを抽出

型付きλ計算!

型検査

証明=プログラムだから当たり前!

証明支援器の必要性 • 証明は

– 面倒 (特に大量の場合分けを要する場合など) – 間違いが混入しやすい(*)

(*)数学の専門家でも。 ⇒ 計算機による証明の検査や半自動証明

証明支援器の応用事例 • 数学

– 4色問題 – Fermatの最終問題(n=3,4のケース) – 代数学の基本定理 – Odd Order Theorem (群論に関する定理) – ケプラー予想

• コンピュータサイエンス – Gödelの不完全性定理 – 種々のアルゴリズムの証明

(Presburger算術、暗号アルゴリズムなど) – 種々のソフトウェアの検証

(コンパイラ、オペレーティングシステム)

Coq(*)のデモ

(*) http://coq.inria.fr