交換律の証明

ここでは、+ の交換律、すなわち任意の ij について、i + j = j + i が成立することを示す。

交換律も結合律と同様に i に関する帰納法で証明する。まず最初に基底を証明する証明譜を示す:

open NAT+ + EQL .
-- arbitarily choosen two naturals:
ops i j : -> Nat .
-- base step:
red 0 + j = j + 0 .
--> should be true.
close

この証明譜を CafeOBJ に読み込ませると、以下に示すように期待しない結果 (j = j + 0) が返ってきてしまった:

-- reduce in %NAT+ + EQL : 0 + j = j + 0
j = j + 0 : Bool
(0.002 sec for parse, 1 rewrites(0.001 sec), 6 matches)
--> should be true.
CafeOBJ> 

CafeOBJ の推論エンジンは健全ではあるが完全ではない。従って、true 以外の簡約結果が返ってきたからと言って、すぐにがっかりすることはない。返ってきた項をよく観察すると、左辺は j が得られているが、右辺は j + 0 で書き換えが停止している。もし、j + 0j に書き換えることができれば、言い換えると、j + 0j が等しいことが言えれば、基底に関する証明は完了する。そこで、次の補題を証明する:

この補題を証明する証明譜は、次のようになる:

-- LEMMA1: \forall i \in Nat: i + 0 = i .

-- PROOF:

open NAT+ + EQL .

ops i : -> Nat .
-- base step:
red 0 + 0 = 0 .
--> should be true.

-- induction hypothesis:
eq i + 0 = i .
-- inductive step:
red s(i) + 0 = s(i) .
--> should be true.

close

-- Q.E.D.

補題1 を証明する証明譜を CafeOBJ に読み込ませると、以下のような結果が得られる:

-- opening module NAT+ + EQL.. done.
-- reduce in %NAT+ + EQL : 0 + 0 = 0
true : Bool
(0.001 sec for parse, 2 rewrites(0.000 sec), 2 matches)
--> should be true.*
-- reduce in %NAT+ + EQL : s(i) + 0 = s(i)
true : Bool
(0.001 sec for parse, 3 rewrites(0.001 sec), 5 matches)
--> should be true.

基底、帰納段階ともに期待した結果が得られたので、補題1 は証明できた。

ここで、交換律を証明する基底の議論に戻る。基底を証明する証明譜に、補題1 を加える:

open NAT+ + EQL .
-- arbitarily choosen two naturals:
ops i j : -> Nat .
-- base step:
eq N:Nat + 0 = N .  -- use LEMMA1.
red 0 + j = j + 0 .
--> should be true.
close

補題1 を加えた証明譜を CafeOBJ に読み込ませると、以下のような結果が得られる。

-- opening module NAT+ + EQL.. done._*
-- reduce in %NAT+ + EQL : 0 + j = j + 0
true : Bool
(0.001 sec for parse, 3 rewrites(0.000 sec), 4 matches)
--> should be true.

以上で、基底に関する証明が完了した。次に帰納段階の証明を行う。帰納段階では、さらに別の補題を必要とする。帰納段階の証明と、もう一つの補題は練習問題として残す。


Original Copyright © Takahiro Seino, all rights reserved.