自然数の偶数性の帰納的および計算上の定義は次のとおりです。
Inductive ev : nat -> Prop :=
| ev_0 : ev O
| ev_SS : forall n:nat, ev n -> ev (S (S n)).
Definition even (n:nat) : Prop :=
evenb n = true.
そして、一方が他方を暗示しているという証拠。
Theorem ev__even : forall n,
ev n -> even n.
intros n E.
induction E as [ | n' E' ].
reflexivity. apply IHE'. Qed.
最初はこの証明についてあまり考えていませんでしたが、よく見ると厄介なことがわかりました。問題は、reflexivity
ステップの後にコンテキストが表示されることを期待していることです
1 subgoal
n' : nat
E : ev (S (S n'))
E' : ev n'
IHE' : ev n' -> even n'
====================================================================== (1/1)
even (S (S n'))
しかし、私が実際に得るのは代わりに
1 subgoal
n' : nat
E' : ev n'
IHE' : even n'
====================================================================== (1/1)
even (S (S n'))
定理はそのまま証明可能ですが、仮説が不思議なことに消えていくのを見るのは気がかりです。最初に期待したコンテキストを取得する方法を知りたいです。Web 検索から、これは Coq で構築された項に対する帰納法に関する一般的な問題であることを理解しています。SO に関する提案された解決策の 1 つはremember
、仮説を保持するための戦術を使用することを提案しています。しかし、この証明でそれを試すと、
Theorem ev__even : forall n,
ev n -> even n.
intros n E.
remember E.
induction E as [ | n' E' ].
ステップで次のエラー メッセージが表示されますinduction
。
Error: Abstracting over the term "n" leads to a term
"fun n : nat => forall e : ev n, e = E -> even n" which is ill-typed.
私にはよくわかりません。問題は自由変数があることだと思いますが、その場合、も導入せずE
に導入する方法がないため、行き詰まります。(それで一般化します)E
n
generalize dependent n
E
最初に予想されるコンテキストを取得する方法はありますか?