「関数」
Aを受け取ってBを返す関数 f : A -> B
Bを受け取ってCを返す関数 g : B -> C
組み合わせることで、Aを受け取ってCを返す関数 g(f(x)) を作れる
「ならば」
AならばB H1 : A -> B
BならばC H2 : B -> C
組み合わせることで、AならばC を証明できる
「関数」と「ならば」どこか似ているような気がしませんか?
9
プログラム風に書いた証明
AならばB H1 : A -> B
BならばC H2 : B -> C
H1とH2を使ったAならばC A -> C の証明
fun x => H2(H1(x))
これなら型検査などの「プログラミング」の道具を応用できそうで
す!
21
Slide 22
Slide 22 text
定理証明支援系Coq
プログラム風に証明を書くことで、証明を検証し、正しい証明かどう
かを確かめることができます。
A_implies_C =
fun (A B C : Type) (H1 : A -> B) (H2 : B -> C)
=> fun (x : A) => H2 (H1 x).
AばらばBは H1 : A -> B
BならばCは H2 : B -> C
それらを使い、 fun (x : A) => H2 (H1 x) とすることで、AならばC
を証明しています。
22
Slide 23
Slide 23 text
タクティックを使った証明
プログラム風に証明を書くのは難しいので、Coqでは普通、タクティ
ックと呼ばれるコマンドをつかって証明を書きます。
From mathcomp Require Import ssreflect.
Theorem a_implies_c A B C:
(A -> B) -> (B -> C) -> (A -> C).
Proof.
move=> H1 H2 HA.
apply H2.
apply H1.
exact HA.
Qed.
23
Slide 24
Slide 24 text
Coqによる「かつ」「または」の証明
Theorem and_comm A B:
A /\ B -> B /\ A.
Proof.
case. (* 仮定の A/\B を分解して、AとBを得る *)
move=> HA HB.
split. (* ゴールの B/\A を分解して、AとBを証明する *)
- exact HB.
- exact HA.
Qed.
24
Slide 25
Slide 25 text
Theorem or_comm A B:
A \/ B -> B \/ A.
Proof.
(* 仮定の A\/B を分解して、A->B\/A と B->B\/A を証明する *)
case.
- move=> HA.
right. (* ゴールのB\/Aから右辺を選ぶ *)
exact HA.
- move=> HB.
left. (* ゴールのB\/Aから左辺を選ぶ *)
exact HB.
Qed.
25