- Coq … INRIAが開発した証明支援系。 http://coq.inria.fr/
- ssreflect … INRIAとMicrosoft Researchが開発した代数の証明群および、そのために作られたCoqの拡張文法。 http://www.msr-inria.inria.fr/Projects/math-components
- CoqTop … CoqのREPL。ちょっとした照明を書くときには使えるかもしれないが開発するのにはほぼ使えない。後述するIDEを使うこと。
- CoqIDE … Gtk (lablGtk) で作られたIDE。エディタとしての機能はイマイチというか残念だけど、Coqの開発環境としてはマトモ。
- ProofGeneral … Emacs用のプラグインで、Coq以外の証明支援系にも使えるらしい。Emacs使いならこれを使うのがよい。
証明とは、目的の型をもつ値を組み立てることに相当する。(Curry-Howard対応)
Definition Modus_Ponens: forall P Q:Prop, (P->Q)->P->Q
:= fun P Q => fun x y => x y.
このような方法は、定理の証明においては普通用いられない。
Theorem Modus_Ponens: forall P Q:Prop, (P->Q)->P->Q.
Proof.
intros.
apply H.
apply H0.
Qed.
定理の証明において一般的に用いられる手法である。
Program Definition Modus_Ponens: forall P Q:Prop, (P->Q)->P->Q
:= fun P Q x _ => x _.
Next Obligation.
Proof.
intros.
exact H.
Qed.
プログラムの中に証明を埋め込みたいときに有用である。
ここでは基本的にパターン2のみが出現する。
- Goal … 無名の定理を証明する。
- Definition … 定義。直接定義を書くのが普通だが、証明モードに入ってもよい。
- Program Definition … 定義をするが、穴を証明モードで補完する。
- Theorem, Lemma, Propositionなど … 証明する。
- Proof. … Proofと書くことによって証明を書く人のやる気を高める。
- Proof with hogehoge. … この証明中で3点リーダー「...」を用いるとhogehogeを実行することになる。
- Qed. … 証明終了。
- Defined. … 定義終了。 証明終了と違い、定義された内容がTransparentになる。
- Admitted. … 証明途中であっても証明を破棄し、その命題を公理として仮定してしまう。
Coqの証明モードでは、ゴールの形を見ながら次に適用するルールを決めていく。
CoqIDEやProofGeneralなどのIDEでは、証明の現在位置が記録されており、現在位置より上は色がついていて編集できないようになっている。
証明の方針が誤っていた場合などは、現在位置を後ろに戻すことができる。
詳しくは実際にIDEを使って証明してみればわかる。
証明モード中で使える証明用のコマンドはtacticと呼ばれる。これはLtacという型なしラムダ計算のプログラムである。
証明のはじめはほぼ確実にintrosが用いられる。
これは目的の定理から仮定をとってくるtacticである。
まずは命題論理で練習するのが定石っぽいのでそれを先に書く。
Coqで命題論理を証明するときのスタンダードな方法は、シークエント計算LJのそれとほぼ同じである。
(自然演繹NJと同等の手順で証明することも不可能ではない)
つまり、仮定と帰結をそれぞれ分解していくことによって定理を証明する。
仮定が | 帰結が | ||
---|---|---|---|
A→B | apply H. / apply H in H0. | intro. | |
A∧B | destruct H. | split. | |
A∨B | destruct H. | left. / right. | |
False | destruct H. | なし |
自然数やリストなどは帰納的に定義されている。こういった値についての帰納法を定義することができる。
自然数nが手元にあり、ゴールにnが含まれているとする。このゴールをP(n)と書くことにしよう。
すると、induction n. という命令をすることで二つのゴールが生成される。
- (1) 仮定には何も追加されていない。ゴールにP(0)がある。
- (2) 仮定には自然数nと、P(n)がある。ゴールにP(S n)がある。
ただし、S nは1+nのことだと考えればよい。
- auto … 仮定やヒントデータベースから証明を探していろいろ適用してみてくれる。
autoは命題論理に対しては強力なので、命題論理で練習している間は使わないこと。