Coq中部分假设的重命名
在销毁了我的证明中的n之后,我陷入了以下困境:Coq中部分假设的重命名,coq,Coq,在销毁了我的证明中的n之后,我陷入了以下困境: 1 subgoal n : nat X : Type h : X t : list X n' : nat E : n = S n' H' : length t = n' IHl : length t = n -> nth_error t n = None ______________________________________(1/1) nth_error t n' = None 我想用国际人道主义法重写,但那是不可能的。我如何组合IH
1 subgoal
n : nat
X : Type
h : X
t : list X
n' : nat
E : n = S n'
H' : length t = n'
IHl : length t = n -> nth_error t n = None
______________________________________(1/1)
nth_error t n' = None
我想用国际人道主义法重写,但那是不可能的。我如何组合IHl和H'来理解和证明这个定理?你不能,因为你的归纳假设不够普遍。以下是一个更容易证明的陈述:
forall (X : Type) (t : list X), nth_error t (length t) = None
你不能,因为你的归纳假设不够普遍。以下是一个更容易证明的陈述:
forall (X : Type) (t : list X), nth_error t (length t) = None
我只是想详细说明一下@Arthur answer 我能够用以下脚本重现您的目标:
Require Import List.
Lemma toto (n : nat) (X : Type) (l : list nat) : length l = n -> nth_error l n = None.
Proof.
induction l as [ | h t IHl].
case_eq n.
simpl; auto.
simpl; discriminate.
case_eq n.
simpl; discriminate.
intros n' E.
simpl; intros E'; injection E'; clear E'; intros H'.
我同意这一目标无法证明。现在,如果您改为以以下文本开始您的证明(必须替换证明
和归纳
行),它将是可证明的(我已选中)
不同之处在于归纳假设现在有以下陈述
forall n : nat, length t = n -> nth_error t n = None
发生了什么事?在第一个(错误的)变体中,您尝试为长度等于精确n的所有列表证明一条语句,因为n
在您开始归纳证明之前是固定的。在第二个(正确的)变体中,您尝试为所有列表证明一个语句l
,并且该语句接受任何n
,只要length l=n
在第一种变体中,n
是固定的,并且相等的length l=n
将l
限制在长度精确n
的变量中。在第二种情况下,首先选择l
,并且n
不是固定的,但是等式length l=n
限制n
跟随l
的长度
这被称为“加载归纳法”,因为语句
forall n,length l=n->nth_error l n=None
比您试图在第一个变量中证明的语句(仅针对一个特定的n
)更强大(它被加载),但令人惊讶的是,这更容易证明。我只是想详细说明一下@Arthur answer
我能够用以下脚本重现您的目标:
Require Import List.
Lemma toto (n : nat) (X : Type) (l : list nat) : length l = n -> nth_error l n = None.
Proof.
induction l as [ | h t IHl].
case_eq n.
simpl; auto.
simpl; discriminate.
case_eq n.
simpl; discriminate.
intros n' E.
simpl; intros E'; injection E'; clear E'; intros H'.
我同意这一目标无法证明。现在,如果您改为以以下文本开始您的证明(必须替换证明
和归纳
行),它将是可证明的(我已选中)
不同之处在于归纳假设现在有以下陈述
forall n : nat, length t = n -> nth_error t n = None
发生了什么事?在第一个(错误的)变体中,您尝试为长度等于精确n的所有列表证明一条语句,因为n
在您开始归纳证明之前是固定的。在第二个(正确的)变体中,您尝试为所有列表证明一个语句l
,并且该语句接受任何n
,只要length l=n
在第一种变体中,n
是固定的,并且相等的length l=n
将l
限制在长度精确n
的变量中。在第二种情况下,首先选择l
,并且n
不是固定的,但是等式length l=n
限制n
跟随l
的长度
这被称为“加载归纳法”,因为语句
forall n,length l=n->nth_error l n=None
比您试图在第一个变量中证明的语句(仅针对一个特定的n
)更强大(加载),但令人惊讶的是,证明起来更容易。您的问题中的上下文太少。你最初的陈述可能是可证明的,但当你用归纳法给出错误的证明结构时,你通常会得到无法证明的目标。答案通常是“加载归纳法”,但如果没有更好的上下文,我们无法给出更多提示。你的问题中的上下文太少了。你最初的陈述可能是可证明的,但当你用归纳法给出错误的证明结构时,你通常会得到无法证明的目标。答案通常是“加载归纳法”,但如果没有更好的上下文,我们无法给出更多的提示。