在Coq /直觉逻辑中,这种关系是否可以证明?

时间:2016-02-20 02:11:35

标签: logic coq implication

以下定理在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。我很清楚在经典逻辑中这是正确的,所以我不是在寻找一个证据来为底层系统增加额外的公理。

2 个答案:

答案 0 :(得分:6)

这是不可证明的,因为它相当于双重否定消除(以及其他经典公理)。

我的Coq技能目前非常生疏,但我可以快速说明为什么你的定理意味着双重否定消除。

在你的定理中,为任意X实例化unitPfun _ => XX : 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中适用于PX的受限类,一个特定的例子是当P是可判定的谓词而{{1}有限型。