我目前在“软件基础”的第5章,但觉得有必要回到第一章来澄清一些事情。特别是有一个我没有完全消化的练习,我们被要求使用两次破坏来证明布尔运算的结果。这里改变了名称和其他细节。关于布尔值的证明,false = true
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,为什么不呢,但这仍然让我感觉有点不舒服。我不会期望证明助理允许这样做。
阐述了一下
在用反证法一个典型的证据,我会选一个假设随机的,并从中获得了目标,直到我发现无论是重言式或矛盾。然后我会得出结论,我的假设是真的还是假的。
H : fb true true = false
它适用于这是一个矛盾的目标:
true = false
这里会发生什么事,在案件1(同为案例3),勒柯克从一个假设,那是假的开始
并结合他们找到重言式。
这不是我知道的推理方法。这回顾了从0 = 1开始的学生“笑话”,可以证明对自然数的任何荒谬结果。
跟进
所以今天早上我上班时我在想什么,我刚刚上面写的。我现在认为案例1和案例3是矛盾的恰当证据。事实上,H是假的,我们用它来证明一个假的目标。假设(a和b的值)必须被拒绝。可能使我困惑的是,使用重写,我们正在从目标开始“落后”的一部分。
我有点拿不定主意的情况下2,其内容为:
H : fb true false = false
______________________________________(1/1)
false = false
这基本上是false -> true
,在“爆炸原理”同义反复。我不认为这可以直接用于证明。
唉,不知道我完全理解了底层是什么,但对Coq的信任没有改变。要继续并回到第5章。谢谢大家的意见。
案件的区别可能有不可能的情况下,他们可以通过推断谎言派遣/排除。这是常见而有效的逻辑推理。 –
我不太清楚你对这个例子感到困惑;你愿意详细说明吗? Coq是否正在制造出有矛盾的假设的子目标? –
也许混淆发生在“通过矛盾的典型证据”中。事实上,您在这里没有通过矛盾做出证明,但您正在使用“爆炸原则”。 https://en.wikipedia.org/wiki/Principle_of_explosion也被称为“Ex Falso,Quodlibet”,“从任何虚假都是真实的”,这似乎是一个非常时髦的原则。 – ejgallego