在命题的归纳中使用记住给出';输入错误';Coq误差
以下是自然数均匀性的归纳和计算定义在命题的归纳中使用记住给出';输入错误';Coq误差,coq,induction,Coq,Induction,以下是自然数均匀性的归纳和计算定义 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. in
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.
起初,我对这一证据不太重视,但仔细观察后,我发现一些令人不安的地方。问题是在自反性步骤之后,我希望看到上下文
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中构造项归纳的一般问题。建议对要保留的假设使用记住策略。但当我在这个证明中试着这么做的时候
Theorem ev__even : forall n,
ev n -> even n.
intros n E.
remember E.
induction E as [ | n' E' ].
我在感应
步骤中收到以下错误消息
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
有一个自由变量,但在这种情况下,我会被卡住,因为如果不引入n
,就无法引入E
。(generalizedependent n
将用它来概括E
)
有没有办法获得最初预期的上下文?我不明白归纳法在这里做什么。
每当我不明白一个策略在做什么时,我就试着自己写一个证明词。
如果手动调用归纳原理,则可以保留原始假设:
Theorem ev__even : forall n, ev n -> even n.
intros n E.
refine (ev_ind even _ _ n E).
- reflexivity.
- intros n' E' IH.
apply IH.
Qed.
这是归纳法第二种情况下的上下文:
n : nat
E : ev n
n' : nat
E' : ev n'
IH : even n'
============================
even (S (S n'))
假定
Fixpoint evenb (n:nat) : bool :=
match n with
| O => true
| S O => false
| S (S n') => evenb n'
end.
为了更有用,归纳策略尝试概括所有变量,这些变量取决于您正在进行归纳的对象,以及取决于其类型的索引的对象。在您的例子中,这意味着对n
、新生成的证明e:ev n
、等式e=e
进行推广。然而,它并没有推广到E
本身,因为命题自动生成的归纳原则忽略了证明论点。不幸的是,这意味着泛化将是病态的,你的直觉是正确的:因为E
不是用n
泛化的,它的类型将提到一个不同的数字,这将使等式E=E
病态。我不明白你为什么期望看到E:ev(S(sn'))
和IHE':ev n'->甚至n'
没关系,我看你在这两方面都是对的。如果你对所有P,p0->p1->(对于所有n,pn->P(S n))->对于所有n,pn
使用归纳原理,那么ev
将像你期望的那样出现在归纳假设中。ev
的感应原理是ev\u ind
,其类型为forall P,p0->(forall n,ev n->pn->P(S(sn))->forall n,ev n->pn
。当对ev
进行归纳时,你不应该期望ev
成为归纳假设的前提,就像对nat
进行归纳时,你不应该期望nat
在归纳假设中被普遍量化。你可以η-使用细化(ev_ind even uu)来减少证明
而不是简介
和优化
。