如何在Coq的假设中实例化forall变量?

时间:2015-07-20 11:12:15

标签: coq

我有两个假设

IHl: forall (lr : list nat) (d x : nat), d = x \/ In x l' -> (something else)
Head : d = x

我希望apply IHl Head,因为它满足IHl的d = x \/ In x l。我尝试了apply with策略,但是通过简单的提示Error: Unable to unify失败了。

我应该使用哪种策略来实例化假设中的变量?

1 个答案:

答案 0 :(得分:7)

您的假设IHl有4个参数:lr : list natd : natx : nat_ : d = x \/ In x l'

您的假设Head : d = x没有正确的类型作为第4个参数传递。你需要将它从平等证明转变为分离证明。幸运的是,您可以使用:

or_introl
     : forall A B : Prop, A -> A \/ B

or类型的两个构造函数之一。

现在您可能必须明确传递B道具,除非可以通过统一在上下文中找出它。

以下是应该有效的事情:

(* To keep IHl but use its result, given lr : list nat *)
pose proof (IHl lr _ _ (or_introl Head)).

(* To transform IHl into its result, given lr : list nat *)
specialize (IHl lr _ _ (or_introl Head)).

您可以使用apply,但根据隐含/推断的内容,我很难告诉您它是哪一个。