用Coq证明重言式


12

目前,我必须学习Coq,并且不知道如何处理or

举个例子,尽管如此简单,但我不知道如何证明:

Theorem T0: x \/ ~x.

如果有人可以帮助我,我将非常感激。

作为参考,我使用该备忘单

我想到的也是一个证明示例:这里是双重否定:

Require Import Classical_Prop.

Parameters x: Prop.

Theorem T7: (~~x) -> x. 
intro H. 
apply NNPP. 
exact H. 
Qed.

NNPP的类型是forall p:Prop, ~ ~ p -> p.,因此使用它来证明是骗人的T7。导入时,Classical_Prop您会得到Axiom classic : forall P:Prop, P \/ ~ P.
Anton Trunov

因此,apply classic.解决了您的目标T0
安东·特鲁诺夫

Answers:


14

您无法在“普通” Coq中证明它,因为它基于直觉逻辑

从证明理论的角度来看,直觉逻辑是经典逻辑的一种局限,在这种逻辑中,排除中和双重否定法则不是有效的逻辑规则。

您可以通过多种方式来处理这种情况。

  • 介绍排除中间定律作为公理:

    Axiom excluded_middle : forall P:Prop, P \/ ~ P.
    

    在此之后,不再需要证明任何东西。

  • 介绍一些等效于排除中间定律的公理,并证明它们的等价性。这里只是几个例子。


到目前为止非常感谢。我不熟悉您编写的所有内容,但会进行检查。我使用了coqIde,实际上也得到了双重否定的证明,我将其添加到问题描述中,以便稍后更加清楚。我期望有一种类似的方法可以解决上述问题。也许我应该举一个例子。
Imago

1
@AntonTrunov您需要在您的括号中加上一些括号Axiom peirce:就目前而言,这不是皮尔斯的定律(并且实际上是trivial要证明)。
加莱

@gallais感谢您发现这一点!固定。
安东·特鲁诺夫

6

正如其他人所告知的那样,除非您假设经典逻辑,否则您的重言式不是重言式。但是,由于您要对可确定的真值进行重言式,因此可以使用bool代替Prop。然后,您的重言式成立了:

Require Import Bool.

Lemma how_about_bool: forall (p : bool), Is_true (p || negb p).
Proof.
  now intros [|].
Qed.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.