|
| 1 | +#+TITLE: 读:Boolean Thinking——当 true 和 false 不够用的时候 |
| 2 | +#+AUTHOR: lujun9972, Claude Code |
| 3 | +#+TAGS: 逻辑, 编程思维, 布尔逻辑, 直觉主义 |
| 4 | +#+DATE: [2026-06-09 Tue] |
| 5 | +#+LANGUAGE: zh-CN |
| 6 | +#+OPTIONS: H:6 num:nil toc:t \n:nil ::t |:t ^:nil -:nil f:t *:t <:nil |
| 7 | +#+DESCRIPTION: 程序员每天和 true/false 打交道,但"非真即假"并不是逻辑的全部。《The Case Against Boolean Thinking》这篇文章,从编程视角解释布尔思维(非黑即白思维)的局限性在于:真假并不绝对,用"证明"替代"真假"更有意义,存在非真非假的第三种可能。 |
| 8 | + |
| 9 | +程序员每天都要跟布尔值打交道。 =if= 条件判断、逻辑运算、函数返回值,每天打交道的就是 =true= 和 =false= 两个状态。[[https://abuseofnotation.github.io/boolean-thinking/][The Case Against Boolean Thinking]] 这篇博文从编程视角解释了布尔思维的局限性,以及为什么「非真即假」这种简化其实是个思维陷阱。 |
| 10 | + |
| 11 | +* 布尔思维是什么 |
| 12 | + |
| 13 | +布尔思维借鉴编程里的 =boolean= 类型,它是一种思维预设,认为每句话、每个命题都必然非真即假。 |
| 14 | + |
| 15 | +这个预设来自经典逻辑中的一条基本定律,即排中律(law of excluded middle),说的是,"对于任何命题 P,P 要么为真,要么为假,没有第三种可能"。在经典逻辑体系里,这是一条公理,不需要证明。 |
| 16 | + |
| 17 | +在编程里,排中律大部分时候管用。一个变量要么是 =nil= ,要么不是;一个文件要么存在,要么不存在。问题在于,布尔思维让人养成一种习惯,遇到任何问题,第一反应就是把它切成非此即彼的两边。但排中律不是在所有场景下都成立的。 |
| 18 | + |
| 19 | +* 真假不绝对 |
| 20 | + |
| 21 | +每句话的真假,都取决于它的上下文。这里的「上下文」指的是一组前提、公理或假设,我们基于它们来推理。同一个命题,换一个上下文,结论可能完全不同。 |
| 22 | + |
| 23 | +布尔思维处理不了的情况有好几种。 |
| 24 | + |
| 25 | +1. *不可知*,上下文不完整时,一个命题可能既无法证明为真,也无法证明为假。比如「宇宙中存在其他智慧生命」,在当前观测能力的上下文里,这个问题没有确定答案。SQL 里的 =NULL= 就是这个概念在编程中的体现,不是 =true= ,也不是 =false= ,而是「不知道」。 |
| 26 | + |
| 27 | +2. *无意义*,问题本身就问错了。比如「数字 7 是绿色的吗?」,这不是真假的问题,是问题本身没有意义。编程中也有类似的情况,对一个不存在的 hash key 调用方法,讨论返回值的「真假」没有意义。 |
| 28 | + |
| 29 | +3. *既真又假*,在不同上下文中,同一个命题可以有不同的真值。比如「人是善良的」,在「人类有利他行为」的上下文里为真,在「人类有自私本能」的上下文里为假。Clojure 的动态绑定( =binding= )体现了同样的道理,同一个变量名,在不同的线程上下文中可以有不同的值。 |
| 30 | + |
| 31 | +布尔思维的处理方式是把这三种情况硬塞进「真」或「假」的框里,认为不可知的东西迟早会有答案,不可知只是因为信息不够。作者把这叫做「严重的布尔思维症状」。 |
| 32 | + |
| 33 | +既然每句话的真假都取决于上下文,那布尔逻辑要求的那个通用上下文到底存不存在呢? |
| 34 | + |
| 35 | +* 布尔逻辑为什么不够用 |
| 36 | + |
| 37 | +布尔逻辑要正常工作,前提是存在一个通用的上下文,一组对所有命题都适用的公理集。这个公理集要满足两个条件,完备(能推出所有真命题),一致(不会推出矛盾)。 |
| 38 | + |
| 39 | +但这样的公理集不存在。哥德尔不完备定理(Gödel's incompleteness theorem)证明了,任何足够强的一致的形式系统都不可能完备。说得通俗一点,不存在一个逻辑框架能同时满足「不自相矛盾」和「回答所有问题」两个要求。要么你接受某些问题没有答案,要么你接受系统里可能有矛盾。 |
| 40 | + |
| 41 | +布尔逻辑适用的那个理想世界(一个公理集管一切的世界),不是我们生活的世界。我们生活的世界是一个需要不断在不同框架之间切换、比较、权衡的世界。 |
| 42 | + |
| 43 | +于是作者干脆绕过修补布尔逻辑这条路,直接换了一种逻辑体系。 |
| 44 | + |
| 45 | +* 直觉主义逻辑,另一种可能 |
| 46 | + |
| 47 | +作者提出的替代方案是直觉主义逻辑(intuitionistic logic),也叫构造性逻辑(constructive logic)。跟经典逻辑的核心区别在于,它的核心概念是「证明」而非「真假」。 |
| 48 | + |
| 49 | +在经典逻辑里,证明是一个过程,目的是判断命题的真假。在直觉主义逻辑里,证明是一个对象,一个构造物,用来展示命题为什么成立。你可以这么理解,经典逻辑问「这件事是真的吗?」,直觉主义逻辑问「你能构造出一个证据吗?」 |
| 50 | + |
| 51 | +关键的区别在于,直觉主义逻辑不接受排中律。面对任何命题,有三种可能。 |
| 52 | + |
| 53 | +1. 能构造出它为真的证明 |
| 54 | +2. 能构造出它为假的证明 |
| 55 | +3. 两种证明都构造不出来 |
| 56 | + |
| 57 | +第三种可能是布尔思维无法容忍的,但在直觉主义逻辑里,它再正常不过。不是所有问题都有答案,也不是所有命题都有确定的真假。承认这一点,人反而从「非此即彼」的执念里松绑了。 |
| 58 | + |
| 59 | +布尔思维的影响不限于学术讨论。 |
| 60 | + |
| 61 | +* 布尔思维的现实影响 |
| 62 | + |
| 63 | +在日常生活中,布尔思维表现为非黑即白的二元对立,一个人要么好要么坏,一件事要么成功要么失败,一个观点要么对要么错。 |
| 64 | + |
| 65 | +当遇到不符合这种框架的现象时,布尔思维会让人做出两种反应,要么假装没看见,扭曲认知让事实硬塞进框架,要么宣布「世界本来就不合逻辑」然后放弃思考。两种反应都不可取。 |
| 66 | + |
| 67 | +真正的出路是承认不同的框架可以共存。你可以在「知足常乐」的框架下享受当下,也可以在「精益求精」的框架下追求进步。两个框架都对,只是适用不同的上下文。没有人能规定哪个框架更「正确」。 |
| 68 | + |
| 69 | +原文还做了一个延伸,布尔思维和威权主义之间有结构性的相似。威权体制的核心操作是规定一套「官方前提」,所有人都必须在这个前提下思考。你在前提之内可以自由推理,但前提本身不可质疑。用奥威尔的话改写就是,「谁控制了前提,谁就控制了结论。」这个类比点到为止,但有一点是明确的,我们怎么思考逻辑,最终会影响到我们怎么思考一切。 |
0 commit comments