暗无天日

=============>DarkSun的个人博客

读:Boolean Thinking——当 true 和 false 不够用的时候

程序员每天都要跟布尔值打交道。 if 条件判断、逻辑运算、函数返回值,每天打交道的就是 truefalse 两个状态。The Case Against Boolean Thinking 这篇博文从编程视角解释了布尔思维的局限性,以及为什么「非真即假」这种简化其实是个思维陷阱。

布尔思维是什么

布尔思维借鉴编程里的 boolean 类型,它是一种思维预设,认为每句话、每个命题都必然非真即假。

这个预设来自经典逻辑中的一条基本定律,即排中律(law of excluded middle),说的是,"对于任何命题 P,P 要么为真,要么为假,没有第三种可能"。在经典逻辑体系里,这是一条公理,不需要证明。

在编程里,排中律大部分时候管用。一个变量要么是 nil ,要么不是;一个文件要么存在,要么不存在。问题在于,布尔思维让人养成一种习惯,遇到任何问题,第一反应就是把它切成非此即彼的两边。但排中律不是在所有场景下都成立的。

真假不绝对

每句话的真假,都取决于它的上下文。这里的「上下文」指的是一组前提、公理或假设,我们基于它们来推理。同一个命题,换一个上下文,结论可能完全不同。

布尔思维处理不了的情况有好几种。

  1. *不可知*,上下文不完整时,一个命题可能既无法证明为真,也无法证明为假。比如「宇宙中存在其他智慧生命」,在当前观测能力的上下文里,这个问题没有确定答案。SQL 里的 NULL 就是这个概念在编程中的体现,不是 true ,也不是 false ,而是「不知道」。
  2. *无意义*,问题本身就问错了。比如「数字 7 是绿色的吗?」,这不是真假的问题,是问题本身没有意义。编程中也有类似的情况,对一个不存在的 hash key 调用方法,讨论返回值的「真假」没有意义。
  3. *既真又假*,在不同上下文中,同一个命题可以有不同的真值。比如「人是善良的」,在「人类有利他行为」的上下文里为真,在「人类有自私本能」的上下文里为假。Clojure 的动态绑定( binding )体现了同样的道理,同一个变量名,在不同的线程上下文中可以有不同的值。

布尔思维的处理方式是把这三种情况硬塞进「真」或「假」的框里,认为不可知的东西迟早会有答案,不可知只是因为信息不够。作者把这叫做「严重的布尔思维症状」。

既然每句话的真假都取决于上下文,那布尔逻辑要求的那个通用上下文到底存不存在呢?

布尔逻辑为什么不够用

布尔逻辑要正常工作,前提是存在一个通用的上下文,一组对所有命题都适用的公理集。这个公理集要满足两个条件,完备(能推出所有真命题),一致(不会推出矛盾)。

但这样的公理集不存在。哥德尔不完备定理(Gödel's incompleteness theorem)证明了,任何足够强的一致的形式系统都不可能完备。说得通俗一点,不存在一个逻辑框架能同时满足「不自相矛盾」和「回答所有问题」两个要求。要么你接受某些问题没有答案,要么你接受系统里可能有矛盾。

布尔逻辑适用的那个理想世界(一个公理集管一切的世界),不是我们生活的世界。我们生活的世界是一个需要不断在不同框架之间切换、比较、权衡的世界。

于是作者干脆绕过修补布尔逻辑这条路,直接换了一种逻辑体系。

直觉主义逻辑,另一种可能

作者提出的替代方案是直觉主义逻辑(intuitionistic logic),也叫构造性逻辑(constructive logic)。跟经典逻辑的核心区别在于,它的核心概念是「证明」而非「真假」。

在经典逻辑里,证明是一个过程,目的是判断命题的真假。在直觉主义逻辑里,证明是一个对象,一个构造物,用来展示命题为什么成立。你可以这么理解,经典逻辑问「这件事是真的吗?」,直觉主义逻辑问「你能构造出一个证据吗?」

关键的区别在于,直觉主义逻辑不接受排中律。面对任何命题,有三种可能。

  1. 能构造出它为真的证明
  2. 能构造出它为假的证明
  3. 两种证明都构造不出来

第三种可能是布尔思维无法容忍的,但在直觉主义逻辑里,它再正常不过。不是所有问题都有答案,也不是所有命题都有确定的真假。承认这一点,人反而从「非此即彼」的执念里松绑了。

布尔思维的影响不限于学术讨论。

布尔思维的现实影响

在日常生活中,布尔思维表现为非黑即白的二元对立,一个人要么好要么坏,一件事要么成功要么失败,一个观点要么对要么错。

当遇到不符合这种框架的现象时,布尔思维会让人做出两种反应,要么假装没看见,扭曲认知让事实硬塞进框架,要么宣布「世界本来就不合逻辑」然后放弃思考。两种反应都不可取。

真正的出路是承认不同的框架可以共存。你可以在「知足常乐」的框架下享受当下,也可以在「精益求精」的框架下追求进步。两个框架都对,只是适用不同的上下文。没有人能规定哪个框架更「正确」。

原文还做了一个延伸,布尔思维和威权主义之间有结构性的相似。威权体制的核心操作是规定一套「官方前提」,所有人都必须在这个前提下思考。你在前提之内可以自由推理,但前提本身不可质疑。用奥威尔的话改写就是,「谁控制了前提,谁就控制了结论。」这个类比点到为止,但有一点是明确的,我们怎么思考逻辑,最终会影响到我们怎么思考一切。

逻辑 : 编程思维 : 布尔逻辑 : 直觉主义