Coq中部分假设的重命名

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

在销毁了我的证明中的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

我想用国际人道主义法重写,但那是不可能的。我如何组合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
)更强大(加载),但令人惊讶的是,证明起来更容易。

您的问题中的上下文太少。你最初的陈述可能是可证明的,但当你用归纳法给出错误的证明结构时,你通常会得到无法证明的目标。答案通常是“加载归纳法”,但如果没有更好的上下文,我们无法给出更多提示。你的问题中的上下文太少了。你最初的陈述可能是可证明的,但当你用归纳法给出错误的证明结构时,你通常会得到无法证明的目标。答案通常是“加载归纳法”,但如果没有更好的上下文,我们无法给出更多的提示。