Software Engineering Lecture s03
Menu Menu
Lambda Calculus and Natural Deduction
今回の参考文献は、Proofs and Types, Jean-Yves Girard, Yves Lafont, Paul Taylor です。
Lambda Calculus
Lambda CalculusNatural Deduction
Natural Deduction は Gentzen によって作られた論理と、その証明システム。ここでは、論理式の記号として命題変数と ∧(かつ)と->(ならば)と∀x(すべてのx)だけを使う。他にも¬(否定)や∨(または)や⊥(矛盾)や∀x(すべてのx)∃x(あるx)があるが、ここでは扱わない。論理式は推論によって作られたり分解されたりする。これが証明である。
: Aは、さまざまな推論によって A が証明されたことを示す。証明は木構造を持ち根が証明された論理式で、証明の葉は仮定である。仮定である葉には dead と alive の二つの状態がある。
A という仮定から推論して B という論理式が得られたとする。
A : BA は alive 生きている仮定である。
->I という推論規則によって、->を導入する。 A : B ------------- A -> B線の上の証明があれば、 A -> B は真である。ここで、A は、この論理式に含まれている。この仮定は解消(discharge)されたので死んで、dead になる。それを [A] と書く。
[A] : B ---------- ->I A -> Bすべての仮定が discharge されれれば、証明された式は仮定無しで真な論理式となる。どの推論により、どの仮定が解消されたかの対応付けを番号で行うと良い。
残りの推論規則は、以下の通り。
Introduction 導入
[A] : : : A B B ------------- ∧I ------- ->I A ∧ B A->BElimnation 除去
: : : : A ∧ B A ∧ B A A -> B ------- ∧1E ------- ∧2E --------------- ->E A B Bここで、A[t/x] は A の中の x を、これまでに現れてない別な記号 t で置き換えたもの。
問題 4.1
Excercise 4.1 以下の論理式を Natural Dection の証明図を使って証明せよ。
(1) A -> A (2) A -> (B -> A) (3) (A ∧ (A -> B)) -> B (4) B -> (B ∧ (A -> B))
Lambda Calculus
ここでは、Haskell の式をそのまま使う。
Types
1. a,b,c などは型である。Haskell の Integer や Char も型である。2. U,V が型なら U -> V も型である。(関数)
3. U,V が型なら (U , V) も型である。(Pair、直積)
ここでは、これらによって作られる型のみを考える。
Term
Term は以下の規則によって型と一緒に構築される。1. Haskell の変数 x,y,z は項。つまり let a = ... で宣言された小文字で始まる記号。対応する型(変数で指定された)を持つ。
1 や 'a' も対応する型を持つ項である。2. u が型U、v が型V を持てば、(u,v) は型(U,V)を持つ項である。
3. 型(U,V)を持つ項 t に対して、fst t は型U を持つ項、snd t は型 V を持つ項である。
4. v が型V を持つ項で、x0,x1,...,xn が型Uを持てば、 \x0 x1 ..., xn -> v は項である。
Haskell によって変数の名前のスコープは適切に扱われるとする。5. t が型 U->V を持ち、u が 型U を持てば、 t u は型V を持つ項である。
これら項は、Haskell によって評価される。これらは変換規則と提供する。
1. 変数は変数の値
2. (u,v) は pair
3. fst と snd は pair の最初と次を取ってくる関数
4. lambda 式は、与えられた引数により変数の置き換えを行う
5. 関数の適用を行う。
等式
fst (x,y) == x snd (x,y) == y (\x y -> v) u == vさらに
((fst v),(snd v))==v (\x t x) = t
正則形 (Normal form)
Haskell の計算は、これらの項をなるべく簡単に変換していくもの。
fst (u,v) snd (u,v) (\x -> v) uのような形が式に含まれていなければ、式はこれ以上計算できない。
逆に含まれていれば、次のように変換できる。
fst (u,v) -> u snd (u,v) -> v (\x -> v) u -> v[u/x] (v の中のxをuで置き換える)置き換えによって、さらに計算が進む場合もある。
問題4.2
Excercise 4.2 以下の式を計算せよ
(\x -> (snd x,fst x)) (1,2)以下の式は Haskkel がエラーを出す。
(\x -> (snd x,fst x)) ((\x -> t 3 ),2)適切に実行されるように t に関する修正を加えよ。
Curry Howard 対応
さて、長い道のりだけど、あと少し。Natural Dection の推論には、Lambda 式が対応する。
A仮定 A は大域変数v。
: : A B ------------- ∧I A ∧ Bこれは、u, v から (u,v) という項作る操作。
[A] : B ------- ->I A -> Bこれは、変数 v を含む式Bから、(\v -> u) を作る操作。v は局所変数となる。
: : A ∧ B A ∧ B ------- ∧1E ------- ∧2E A Bこれは、v から fst v, snd v を行う操作。
: : A A -> B --------------- ->E B(\x v) u に対応する。
問題 4.3
Excercise 4.3 以下の論理式の証明図に対応する Lambda 式を作れ。
(1) A -> A (2) A -> (B -> A) (3) (A ∧ (A -> B)) -> B (4) B -> (B ∧ (A -> B))作成した Lambda 式の型が、上の式に一致するはずである。
Curry Howard 対応を使った証明支援系
証明したい論理式が与えられた時に、それを Haskell の型で表す。その型を生成する Lambda 式を作成する。
すると、その Lambda 式が証明に対応している。
Sum
排他的論理和 disjunctin とも呼ばれる。
: : A B ------- ∨1I ------- ∧∨I A ∨ B A ∨ Bは良いが、
A ∨ B ------------- ∨E-bad A Bとは、残念ながらならない。帰結は一つにするルールだった。
[A] [B] : : A ∨ B C C ------------------------------ ∨E Cとすると良い。これは、Haskell の case of に相当する。
data Sum a = Left a | Right a case x of Left a -> a ; Right a -> a Prelude> :t ( \x -> case x of Right y -> y ; Left z -> z )これに相当するλ式の記法は、
∨1I ι1 ∨2I ι2 ∨E δ x.u y.v tそれぞれ、
ι1 : A -> A ∨ B ι2 : B -> A ∨ B δ x.u y.v t : (A -> C) -> (B -> C) -> (A ∨ B) -> Cという型を持つ。そして、その型の証明図を生成している。
問題 4.4
Excercise 4.4 以下の論理式の証明図に対応する Lambda 式を作れ。
(1) A -> A ∨ B (2) B -> A ∨ B (3) A ∨ A -> A (4) (A -> B) ∨ (A -> C) -> A -> ( B ∨ C )