Library auto
ここで No more subgoals. と表示されて、証明できたことがわかります。
構築された証明項は Show Proof というコマンドで表示できます。
Show Proof.
(fun (P : Prop) (H : P) => H)Show Proof とすると私の環境 (CoqIDE) では以下のように表示されます。
(fun (P : Prop) (H : P) => H)
Qed.
ところで、Qed としたときに Unnamed_thm is defined と表示されます。
つまり、Unnamed_thm という定理が定義された、ということですが、
もちろん、後で使いたい定理にこういう内容に関係ない名前をつけるのはよくありません。
自分で定理に名前をつけるときには Goal ではなく Lemma や Theorem で証明を始めます。
Lemmaというのは補題で、Theoremというのは定理ですが、
機能的な違いはとくにありません。ここでは常に Lemma をつかうことにします。
証明しようとしているのは上と同じく forall (P : Prop), P -> P という命題であり、
これはその証明に LemmaPP という名前をつけよう、という指定です。
証明が終った後、Print LemmaPP とすると以下のように表示されます。
LemmaPP = fun (P : Prop) (H : P) => H : forall P : Prop, P -> Pこれは、LemmaPP の値は fun (P : Prop) (H : P) => H という値であり、 その型は forall P : Prop, P -> P である、という意味です。 プログラムの世界で解釈すれば、まさに LemmaPP という定数は 構築した証明項を値として定義されている、 というわけです。