Library ssr_intro
From mathcomp Require Import all_ssreflect.
move=>
?Goalここでは証明を始めたばかりなので、Goal に与えた forall P : Prop, P -> P という命題そのものを証明せよ、と Coq から要求されています。 そこで Show Proof とすると ?Goal と表示されます。 つまり、証明項はまったく構築されておらず、 forall P : Prop, P -> P という型の 値をどうにか作ってここに埋めていかなければならないというわけです。
move⇒ P.
Show Proof.
Show Proof.
(fun P : Prop => ?Goal)move=> P により、証明すべき命題 forall P : Prop, P -> P の左側の forall P : Prop という部分が前提に移動して前提に P : Prop が入り、 証明すべき命題は P -> P に変化します。 ここで Show Proof とすると、(fun P : Prop => ?Goal) と表示されます。 つまり、move=> P は証明項を Prop型の値Pを受け取る関数抽象(λ式)として構築せよ、 という指示です。 関数抽象の本体はまだ不明なので ?Goal となっていますが、 この部分の型は (forall P : Prop, P -> P から左側の forall P : Prop を取り除いた型である) P -> P です。 そのため、P -> P という型である ?Goal の部分をこれから構築しなければならない、 という状態であることがわかります。
move⇒ H.
Show Proof.
Show Proof.
(fun (P : Prop) (H : P) => ?Goal)move=> H により、証明すべき命題 P -> P の左側の P -> が消えて 前提に H : P に移動し、証明すべき命題は P に変化します。
exact H.
Show Proof.
Show Proof.
(fun P : Prop => id)P という型の値としては H が存在する(参照できる)ので、 それを証明項として与えれば証明は終わりです。 exact H により H を証明項として直接与えると No more subgoals. と表示されて 証明が終ったことがわかります。 ここで Show Proof とすると、(fun P : Prop => id) と表示されます。 Display notations を無効にすれば (fun (P : Prop) (H : P) => H) と表示され、 上で ?Goal だったところに H が埋められていることが分かります。 証明項に不明な部分はもうないので、やることはもうありません。 Qed で証明を終りましょう。
Qed.