关于布尔值的证明,false = true

时间:2017-02-20 22:06:15

标签: coq

我目前正处于"软件基金会的第5章"但我觉得有必要回到第一章来澄清一些事情。特别是有一个我没有完全消化的练习,其中我们被要求使用两次破坏来证明布尔值的结果。这里改变了名称和其他细节。

Inductive bool: Type :=
|true: bool
|false: bool.

Definition fb (b1:bool) (b2:bool) : bool :=
match b1, b2 with
| false, false => false
| _, _ => true
end.

Theorem th: forall a b: bool,
  fb a b = false -> b = false.
Proof.
intros [] [] H.
- rewrite <- H. reflexivity.
- reflexivity.
- rewrite <- H. reflexivity.
- reflexivity.
Qed.

在第一次打勾时,背景和目标都是无意义的:

H : fb true true = false
______________________________________(1/1)
true = false

第二个假设是假的。第三个刻度与第一个刻度相同。只有第四个滴答是合理的:

H : fb false false = false
______________________________________(1/1)
false = false

我理解通过重写规则,所有这些都可行。但是我的印象是,我们正在为虚假的荒野放弃狭隘的道路。更准确地说,和AFAIK,可以做出错误的假设来证明任何陈述,无论是真是假。在这里我们用它来证明false = true,好吧为什么不呢,但仍然让我觉得有点不舒服。我不希望证明助理允许这样做。

详细阐述

在一个典型的矛盾证明中,我会随机选择一个假设,然后得出目标直到我发现重言式或矛盾。然后我会得出结论我的假设是真还是假。

这里发生了什么,在案例1中(案例3相同),Coq从一个假设的假设开始:

H : fb true true = false

将其应用于一个矛盾的目标:

true = false

并将它们结合起来找到重言式。

这不是我所知道的推理方式。这让人回想起学生们的笑话&#39;从0 = 1开始,可以证明任何关于自然数的荒谬结果。

跟进

所以今天上午我上下班时我正在考虑上面刚写的内容。我现在相信案例1和案例3是矛盾的正确证明。确实H是假的,我们用它来证明一个错误的目标。必须拒绝假设(a和b的值)。可能让我感到困惑的是,使用重写我们正在做的一部分&#34;向后&#34;,从目标开始。

对于案例2,我有点犹豫不决,其中包括:

H : fb true false = false
______________________________________(1/1)
false = false

基本上是false -> true,是&#34;爆炸原则下的重言式&#34;。我不认为这可以直接用在证明中。

哦,好吧,我不确定我是完全理解引擎盖下的内容,但是对Coq的信任是不受影响的。要继续并回到第5章。感谢大家的评论。

1 个答案:

答案 0 :(得分:3)

首先,感谢您提供自包含的代码。

当你知道你真正应该做的是从假设中产生矛盾时,我理解你使用rewrite证明目标的不安。但这并不能使推理不正确。确实,在这样的假设下你可以证明这个目标。

但是我也认为这并不能使证明脚本真正可读。在您的示例中,您正在考虑所有可能的情况,并且发生这四个中的三个是不可能的。当我们阅读您的证据时,我们无法看到。为了清楚表明你处在一个不可能的案例中,有一些策略可以说“看,我现在要证明是一个矛盾,以排除这种情况”。

其中一个是exfalso。它会以False替换当前目标(因为任何内容都可以从False派生,如@ejgallego在评论中所提到的那样。)

第二个是absurd说“我现在要证明一些陈述及其否定”(这基本上相当于证明了假)。

在你的情况下,第三个就足够了discriminate。它试图在假设中找到一个矛盾的平等,例如true = false

Theorem th: forall a b: bool,
  fb a b = false -> b = false.
Proof.
  intros [] [] H.
  - discriminate.
  - discriminate.
  - discriminate.
  - reflexivity.
Qed.

现在,您知道,discriminatereflexivity都是easy策略尝试的。因此,以下证据也可以起作用(但它没有显示正在发生的事情,因此不属于本问题的范围):

Theorem th: forall a b: bool,
  fb a b = false -> b = false.
Proof.
  intros [] [] H; easy.
Qed.

这是相同证据的语法糖:

Theorem th: forall a b: bool,
  fb a b = false -> b = false.
Proof.
  now intros [] [] H.
Qed.