我目前正在研究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).
谢谢。
答案 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