Coq 无法找到变量x的实例,即使是显式实例化

Coq 无法找到变量x的实例,即使是显式实例化,coq,Coq,我目前正在完成,我被困在(subseq_trans)的最后一部分 以下是我对subseq的定义: Inductive subseq { X : Type } : list X -> list X -> Prop := | s1 : forall l, subseq [] l | s2 : forall (x : X) (l l': list X), subseq l l' -> subseq l (x :: l') | s3 : forall (x : X) (l

我目前正在完成,我被困在(subseq_trans)的最后一部分

以下是我对subseq的定义:

Inductive subseq { X : Type } : list X -> list X -> Prop :=
  | s1 : forall l, subseq [] l
  | s2 : forall (x : X) (l l': list X), subseq l l' -> subseq l (x :: l')
  | s3 : forall (x : X) (l l' : list X), subseq l l' -> subseq (x :: l) (x :: l').
下面是我对subseq_trans的证明:

Theorem subseq_trans : forall (X : Type) (l1 l2 l3 : list X),
   subseq l1 l2 -> subseq l2 l3 -> subseq l1 l3.
Proof.
  intros X l1 l2 l3 H H'.
  generalize dependent H.
  generalize dependent l1.
  induction H'.
  { intros l1 H. inversion H. apply s1. }
  { intros l1 H. apply s2. apply IHH'. apply H. }
  { intros l1 H. apply s2. apply IHH'. apply s2 in H. (* Unable to find an instance for the variable x. *) }
以下是应用失败之前的证明上下文:

1 subgoal
X : Type
x : X
l, l' : list X
H' : subseq l l'
IHH' : forall l1 : list X, subseq l1 l -> subseq l1 l'
l1 : list X
H : subseq l1 (x :: l)
______________________________________(1/1)
subseq l1 l
我尝试过像这样显式实例化x:

apply s2 with (x:=x) in H
但这给了我:

No such bound variable x (possible names are: x0, l0 and l'0).
提前感谢。

您可能会发现该策略对了解情况很有用

...
{ intros l1 H. apply s2. apply IHH'. eapply s2 in H.
给出了
子问题l1(?1::x::l)
,在这里您可以用您想要的任何东西实例化
?1
,但是,正如您现在看到的,从该假设向前应用
s2
并不能推进证明

另一种可能性是将
s2
应用于
x
,然后应用于假设
H

apply (s2 x) in H.
我还觉得奇怪的是,
apply s2 with(x:=x)
不起作用。Coq似乎在幕后进行了一些重命名,可能是为了避免与校对上下文中的
x
混淆。以下顺序适用,无误:

rename x into y. apply s2 with (x:=y) in H.

正如@tbrk所诊断的,这是Coq在存在最大隐式参数的情况下进行的重命名(请参阅)。这是由于在
子序列
的定义中声明了
{X:Type}

一种解决方案是使用
@
将所有隐式参数转换为非隐式参数,并避免此重命名问题。这将使:

apply @s2 with (x:=x) in H.

下面的答案能解决你们的问题吗?我想我是这里的一个受害者,从某种意义上说,我的证明方向是错误的(我现在已经找到了解决办法)。然而,阅读关于eapply和一些coq内部结构的文章是很有趣的,我认为它们在将来的某个时候一定会派上用场。参考:我期望发生的是
apply s2 with(x:=x)in H
H:subseq l1(x::l)
转化为
H:subseq l1 l
。但这源于对应用如何在假设中起作用的错误解释。这是从假设向前推理和从目标向后推理之间的区别。我宁愿回答你的具体问题,也不愿破坏完成练习的乐趣。尽管如此,我还是会毫不犹豫地接受其中一个答案,并对这两个答案都投赞成票!;-)