在命题的归纳中使用记住给出';输入错误';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)来减少证明
而不是
简介
优化