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

时间:2018-10-11 13:23:07

标签: coq

我目前正在研究Logical Foundations book,并且停留在Exercise: 4 stars, advanced (subsequence)(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).

谢谢。

2 个答案:

答案 0 :(得分:2)

由@tbrk诊断,这是Coq在存在最大隐式参数的情况下进行的重命名(请参见this issue)。这是由于在{X : Type}的定义中声明了subsequence

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

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

答案 1 :(得分:1)

您可能会发现eapply策略对了解正在发生的事情很有帮助。

df1 <- mtcars
df2 <- mtcars
df3 <- mtcars
notdf4 <- mtcars
dfx <- ls()[grep("^df", ls())]
data <- bind_rows(eval(parse(text = dfx)))

给出... { intros l1 H. apply s2. apply IHH'. eapply s2 in H. ,您可以在其中使用所需的任何实例来实例化subseq l1 (?1 :: x :: l),但是,如您现在所见,从该假设应用?1 forward 不会提供证明。

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

H

我还发现apply (s2 x) in H. 不起作用很奇怪。 Coq似乎在幕后进行了一些重命名,可能是为了避免在证明环境中与apply s2 with (x:=x)混淆。以下顺序适用,没有错误:

x