我一直在各种情况下尝试apply
策略,当前提是这样时似乎陷入了以下情况:
H1 : a
H2 : a -> forall e : nat, b -> g e
============================
...
当我尝试apply H2 in H1.
时,它会给我错误:
Error: Unable to find an instance for the variable e.
任何方式让我forall e : nat, b -> g e
作为前提的一部分。这是具有上述场景的完整工作代码:
Lemma test : forall {a b c : Prop} {g : nat} (f : nat -> Prop),
a /\ (a -> forall {e : nat}, b -> f e) -> c.
Proof.
intros a b c f g.
intros [H1 H2].
(* apply H2 in H1. *)
Abort.
答案 0 :(得分:2)
Coq参考手册,§8.2.5:
策略
apply
术语in
ident 尝试匹配 ident 类型的结论 term 类型的非依赖前提,从右到左尝试它们。如果成功,则假设 ident 的陈述将被 term 类型的结论替换。
现在,将上述说明应用于您的案例,我们得到以下内容,Coq尝试将H1 : a
替换为H2
的结论,即g e
。要做到这一点,它需要实例化具有一定值的通用量化变量e
,Coq无法明确推断 - 因此您看到的错误消息。
另一种看待它的方法是尝试apply ... in ...
的另一种变体:
eapply H2 in H1.
将为您提供两个子目标:
...
H2 : a -> forall e : nat, b -> g e
H1 : g ?e
============================
c
和
...
H1 : a
H2 : a -> forall e : nat, b -> g e
============================
b
第一个子目标的H1
假设显示了Coq对普通apply in
策略的要求,但在eapply in
情况下,变量e
被替换为存在变量(?e
)。如果您还不熟悉存在变量,那么它们是您对Coq的承诺,您将在以后为它们构建术语。你应该通过统一隐式地构建术语。
无论如何,specialize (H2 H1).
可能是您想要做的事情,或类似的事情
pose proof (H2 H1) as H; clear H1; rename H into H1.