apply waric无法找到变量的实例

时间:2017-04-12 23:05:53

标签: coq

我一直在各种情况下尝试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.

1 个答案:

答案 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.