以下定理在Coq中是否可证明?如果没有,有没有办法证明它不可证明?
Theorem not_for_all_is_exists:
forall (X : Set) (P : X -> Prop), ~(forall x : X, ~ P x) -> (exists x: X, P x).
我知道这种相关关系是真的:
Theorem forall_is_not_exists : (forall (X : Set) (P : X -> Prop), (forall x, ~(P x)) -> ~(exists x, P x)).
Proof.
(* This could probably be shortened, but I'm just starting out. *)
intros X P.
intros forall_x_not_Px.
unfold not.
intros exists_x_Px.
destruct exists_x_Px as [ witness proof_of_Pwitness].
pose (not_Pwitness := forall_x_not_Px witness).
unfold not in not_Pwitness.
pose (proof_of_False := not_Pwitness proof_of_Pwitness).
case proof_of_False.
Qed.
但我不确定如果没有双重否定消除可以帮助我。我也用不同的方法来证明有问题的定理,但无济于事。我只是在学习Coq,所以我可能只是错过了一些明显的东西。
N.B。我很清楚在经典逻辑中这是正确的,所以我不是在寻找一个证据来为底层系统增加额外的公理。
答案 0 :(得分:6)
这是不可证明的,因为它相当于双重否定消除(以及其他经典公理)。
我的Coq技能目前非常生疏,但我可以快速说明为什么你的定理意味着双重否定消除。
在你的定理中,为任意X
实例化unit
到P
和fun _ => X
到X : Prop
。现在我们有~(unit -> ~ X) -> exists (u : unit), X
。但由于unit
的微不足道,这相当于~ ~ X -> X
。
可以通过~ ~ (exists x, P x)
上直接应用双重否定消除来证明向后的含义。
我的Agda要好得多,所以我至少可以在那里显示证据(不知道这是否有用,但它可能会稍微支持我的说法):
open import Relation.Nullary
open import Data.Product
open import Data.Unit
open import Data.Empty
open import Function
∀∃ : Set _
∀∃ = (A : Set)(P : A → Set) → ¬ (∀ x → ¬ P x) → ∃ P
Dneg : Set _
Dneg = (A : Set) → ¬ ¬ A → A
to : ∀∃ → Dneg
to ∀∃ A ¬¬A = proj₂ (∀∃ ⊤ (const A) (λ f → ¬¬A (f tt)))
fro : Dneg → ∀∃
fro dneg A P f = dneg (∃ P) (f ∘ curry)
答案 1 :(得分:4)
你的not_for_all_is_exists
命题在Coq中是不可证明的。我建议阅读Dirk Van Dalen" Logic and Structure"第5章进行了更深入的解释。
在直觉主义逻辑(以及诸如Coq的系统)中,为了证明exists x, P x
,你必须提供一种方法(或算法)来构造实际的x
,使P x
成立。
假设not (forall x, not (P x))
大致有解释"如果我认为P
并不适用于所有x,那么我会得到一个矛盾",但这比你得到的结论,建立一个模型将揭示假设不包含足够的信息来挑选P
的见证人。
但是,必须说这个原则在Coq中适用于P
和X
的受限类,一个特定的例子是当P
是可判定的谓词而{{1}有限型。