Coq 如何';埃利姆';关于存在量词的研究?

Coq 如何';埃利姆';关于存在量词的研究?,coq,first-order-logic,Coq,First Order Logic,我对Coq处理存在量化的方式感到困惑 我有一个谓词p和一个假设H P : nat -> Prop H : exists n, P n 而目前的目标是(无论如何) 如果我想在H中实例化n,我会这样做 elim H. 然而,在淘汰之后,当前的目标变为 forall n, P n -> (Some goal) 看起来Coq把一个存在量词转换成了一个通用量词。我知道(对于所有的a,pa->qa)->((存在a,pa)->qa)是基于我对一阶逻辑的有限知识。但相反的观点似乎是不正确的。如

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

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

P : nat -> Prop
H : exists n, P n
而目前的目标是(无论如何)

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

elim H.
然而,在淘汰之后,当前的目标变为

forall n, P n -> (Some goal)
看起来Coq把一个存在量词转换成了一个通用量词。我知道(对于所有的a,pa->qa)->((存在a,pa)->qa)是基于我对一阶逻辑的有限知识。但相反的观点似乎是不正确的。如果“forall”和“exists”不相等,为什么Coq会进行这种转换


Coq中的“elim”是否会用一个更难证明的目标来取代目标?或者有人能说明为什么((存在a,PA)->Q a)->(对于所有a,PA->Q a)在一阶逻辑中成立吗?

也许缺少的关键是目标:

forall n, P n -> (Some goal)
应理解为:

对于所有n,(pn->(一些目标))

而不是:

(forall n, P n) -> (Some goal)
也就是说,给你的目标只是给你一个任意的
n
和一个证明
pn
,这确实是消除存在论的正确方法(你不需要知道证人的价值,因为它可能是使
P
为真的任何价值,你只需要知道有一个
n
并且
pn
成立)


相反,后者将为您提供一个函数,可以为您传递的任何
n
构建
pn
,这确实是一个比您拥有的声明更有力的声明。

我意识到这个问题很老,但我想补充以下重要的澄清:

在Coq(更一般地说,在直觉逻辑中)中,存在量词的定义(见)如下

(exists x, (P x)) := forall (P0 : Prop), ((forall x, (P x -> P0)) -> P0)
直觉上,这可以理解为

(存在x,px)
是最小的命题,只要
px0
对某些
x0

事实上,我们可以很容易地用Coq证明以下两个定理:

forall x0, (P x0 -> (exists x, P x))    (* the introduction rule -- proved from ex_intro *)
和(提供的
A:Prop

所以这是一个Coq形式的目标

H1...Hn, w : (exists x, P x) |- G
H1...Hn, w : (exists x, P x) |- forall x0, (P x0 -> G)
转换(使用elim)为表单的Coq目标

H1...Hn, w : (exists x, P x) |- G
H1...Hn, w : (exists x, P x) |- forall x0, (P x0 -> G)
因为只要
h:forall x0,(px0->G)
,那么
G
就可以通过证明项精确地证明

(ex_ind A P G h w) : G
无论何时
G:Prop
,它都能工作

注意:上述消除规则仅在
A:Prop
时有效,并且不能在
A:Type
时证明。在Coq中,这意味着我们没有正确的
消除器。


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

如果p仅适用于两个nat值,但只有一个可以推断(某个目标),该怎么办?如果目标转换为“forall”风格,我必须证明这两种情况都是正确的。那么Coq是否进行了积极的转换?@xywang否。当你消除存在量词时,你会得到一个抽象的、任意的
nat
。你不知道它是哪一个,只是
P
保持不变。所以你需要证明
某个目标
只要知道
存在一个P持有的nat
。如果你需要知道哪个
nat
是为了证明
某个目标
,那么你的定理陈述太笼统了,你需要的信息比存在假设给你的更多。@Ptival的答案解释得很好。也不是这样e您只需添加一个
介绍。
即可在您的上下文中获得
n