如何证明forall x,(R x \ / ~R x)[在Coq证明助理中]?

时间:2014-02-23 16:45:28

标签: coq proof

如何在Coq中证明forall x, (R x \/ ~R x)。我是一个菜鸟,对这个工具知之甚少。 这就是我写的:

Variables D: Set.
Variables R: D -> Prop.
Variables x:D.

Lemma tes : forall x, (R x \/ ~R x).

我试过这个并且它有效,但仅限于自动模式。如果我打印出来的证据我无法理解打印内容的含义(所以我可以回去尝试不用自动模式):

Require Import Classical.

Variables D: Set.
Variables R: D -> Prop.
Variables x:D.

Lemma tes : forall x, (R x \/ ~R x).
Proof.
intro.
tauto.
Qed.

Print tes.

tes = 
fun x0 : D =>
NNPP (R x0 \/ ~ R x0)
  (fun H : ~ (R x0 \/ ~ R x0) =>
   (fun H0 : R x0 -> False =>
    (fun H1 : ~ R x0 -> False =>
     (fun H2 : False => False_ind False H2) (H1 H0))
      (fun H1 : ~ R x0 => H (or_intror H1)))
     (fun H0 : R x0 => H (or_introl H0)))
     : forall x : D, R x \/ ~ R x

1 个答案:

答案 0 :(得分:0)

证明这一点的一种方法是

Print classic.
Print R.
Print x.
Check R x.
Check classic (R x).
Check fun y => classic (R y).

Definition tes2 : forall x, (R x \/ ~ R x) := fun y => classic (R y).

或使用战术

Lemma tes3 : forall x, (R x \/ ~ R x). Proof. intro. apply classic. Qed.

Print tes3.

tauto找到的证据是

Lemma tes : forall x, (R x \/ ~R x).
Proof.
intro.
eapply NNPP.
intro.
assert (R x0 -> False).
intro.
eapply H.
eapply or_introl.
exact H0.
assert (~ R x0 -> False).
intro.
eapply H.
eapply or_intror.
exact H1.
assert False.
eapply H1.
exact H0.
eapply False_ind.
exact H2.
Qed.

intro策略构建lambda抽象,并执行暗示引入和通用量化介绍,apply策略结合先前已证明的定理,并执行第一个先行词已经被证明的模式ponens,{ {1}}战术给出了确切的证明术语,exact策略也执行了模式推理,其中没有给出规则的前提。要了解战术如何操纵证明术语,请在应用策略之前和之后使用assert命令。