Library revert
?Goal先ほどのセクションの説明と同じく、P -> P の証明ですが、 最初に Show Proof とすると、?Goal と表示され、 証明項はまったくできていないことがわかります。
intro H.
Show Proof.
Show Proof.
(fun H : P => ?Goal)intro H で、H : P を前提に移したところで Show Proof とすると、(fun H : P => ?Goal) となり、 引数Hを受け取る関数抽象が構築されることがわかります。
revert H.
Show Proof.
Show Proof.
(fun H : P => ?Goal H)ここで revert H として、H : P を証明対象に戻したところで Show Proof とすると、 (fun H : P => ?Goal H) と表示されます。 まずわかることは「戻す」というのは証明項が元に戻るわけではないことです。 実際には ?Goal が ?Goal H に変化する、つまり、戻したものを引数とする関数呼び出しが構築され、 関数部分が新しいゴールとなります。
intro H.
revert H.
intro H.
revert H.
Show Proof.
revert H.
intro H.
revert H.
Show Proof.
(fun H : P => (fun H0 : P => (fun H1 : P => ?Goal H1) H0) H)意味もなく intro H と revert H を繰り返してみると、証明項は (fun H : P => (fun H0 : P => (fun H1 : P => ?Goal H1) H0) H) となります。関数抽象と関数呼び出しが増えていることが分かります。 Coq が表示する前提と証明する命題は変わりませんが、 内部では証明項が(意味もなく)膨らんでいるわけです。