Coq 如何';埃利姆';关于存在量词的研究?
我对Coq处理存在量化的方式感到困惑 我有一个谓词p和一个假设HCoq 如何';埃利姆';关于存在量词的研究?,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)是基于我对一阶逻辑的有限知识。但相反的观点似乎是不正确的。如
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
。