我对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)保持一阶逻辑?
答案 0 :(得分:3)
可能缺少的关键是目标:
forall n, P n -> (Some goal)
应理解为:
forall n,(P n - >(某些目标))
而不是:
(forall n, P n) -> (Some goal)
也就是说,你给出的目标只是给你一个任意的n
和一个证明P n
,这确实是消除存在主义的正确方法(你不会知道证人的价值,因为它可以是使P
成立的任何价值,您只需知道有n
且P 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),这是保留良好程序提取属性的一种设计选择。