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
     :
     B
A は 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->B         
Elimnation 除去
     :                :             :        :      
   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 )