这是自然数均匀性的归纳和计算定义。
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'))
尽管这个定理仍然可以证明,但看到假设神秘地消失是令人不安的。我想知道如何获得我最初期望的上下文。从网络搜索中,我了解到这是对 Coq 中构造术语进行归纳的一般问题。关于 SO 的一种建议解决方案建议使用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
)
有没有办法获得最初预期的上下文?