如何在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
答案 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
命令。