Coq中的'elim'如何处理存在量词?

时间:2015-06-03 02:10:07

标签: coq first-order-logic

我对Coq处理存在量化的方式感到困惑。

我有一个谓词P和一个假设H

P : nat -> Prop
H : exists n, P n

而目前的目标是(无论如何)

(Some goal)

如果我想在H中实例化n,我会做

elim H.

然而,在消除之后,当前的目标变为

forall n, P n -> (Some goal)

看起来Coq将存在量词转换为普遍量词。我知道(forall a,P a - > Q a) - > ((存在a,P a) - > Q a)出于对一阶逻辑的有限知识。但反向命题似乎是不正确的。如果“forall”和“存在”之一不相等,为什么Coq会进行这样的转换?

Coq中的'elim'是否更难以替换目标?或者任何人都可以请说明为什么((存在a,P a) - > Q a) - > (forall a,P a - > Q a)保持一阶逻辑?

2 个答案:

答案 0 :(得分:3)

可能缺少的关键是目标:

forall n, P n -> (Some goal)

应理解为:

forall n,(P n - >(某些目标))

而不是:

(forall n, P n) -> (Some goal)

也就是说,你给出的目标只是给你一个任意的n和一个证明P n,这确实是消除存在主义的正确方法(你不会知道证人的价值,因为它可以是使P成立的任何价值,您只需知道有nP n成立。

相反,后者会为你提供一个函数,可以为你传递的任何P n构建n,这确实是一个比你拥有的更强的陈述。

答案 1 :(得分:0)

我知道这个问题很旧,但我想补充以下重要说明:

在Coq中(更普遍地,在直觉逻辑中),存在量词是定义的(请参见here),如下所示

(exists x, (P x)) := forall (P0 : Prop), ((forall x, (P x -> P0)) -> P0)

直觉上可以理解为

(exists x, P x)是最小的命题,只要P x0保留某些x0

实际上,可以很容易地证明Coq中的以下两个定理:

forall x0, (P x0 -> (exists x, P x))    (* the introduction rule -- proved from ex_intro *)

和(提供A : Prop

(exists x : A, P x) -> {x : A | P x}    (* the elimination rule -- proved from ex_ind *)

那么表单的Coq目标

H1...Hn, w : (exists x, P x) |- G

(使用elim)转换为形式的Coq目标

H1...Hn, w : (exists x, P x) |- forall x0, (P x0 -> G)

因为只要h : forall x0, (P x0 -> G),然后G便被证明项精确证明

(ex_ind A P G h w) : G

G : Prop时有效。

注意:以上消除规则仅在A : Prop时有效,而在A : Type时不成立。在Coq中,这意味着我们没有ex_rect消除器。

根据我的理解(有关更多详细信息,请参见here),这是保留良好程序提取属性的一种设计选择。