逻辑学简史:逻辑、数学与计算机语言的三百年共生史


逻辑这东西根本不是用来讲道理的,它是用来造计算机的!

四十年前你妈买菜都不用算盘,现在你手机里一个芯片每秒干几十亿次布尔运算。你以为逻辑是哲学课上的思辨游戏吗?错了,逻辑是工业流水线上最硬的零件!


逻辑从吵架工具变成计算机的底层语法,中间到底发生了什么?从古希腊诡辩家的输赢判定,到英特尔芯片里几十亿个逻辑门,这条线索串起了整个人类理性的硬件化进程。读完你会发现,你每天刷手机时手指底下按着的,其实是两千五百年的思想战争。


逻辑最初就是用来定输赢的,跟真理没关系

公元前五世纪,古希腊有一群人叫诡辩家。这帮人靠教人吵架赚钱,就跟今天教人面试技巧的培训机构差不多。他们收学费,教富家子弟怎么在公开辩论中把对手怼到哑口无言。但问题来了:辩论赛总得有裁判吧?谁赢了谁输了,总不能全靠观众鼓掌大小来决定。

于是诡辩家们想出一个办法:制定一套客观的规则系统,不管裁判偏不偏心,只要按规则走,谁输谁赢一目了然。这套规则系统,就是逻辑最早的雏形。

弗朗西斯·培根在1605年说得特别直白:“逻辑和修辞学的区别在于,逻辑处理的是精确的、真实的推理,而修辞学处理的是流行意见和风俗中生长的推理。”翻译成人话:逻辑是硬核的,修辞是忽悠人的。诡辩家们要的就是这套硬核玩意儿,好让自己收的学费物有所值。

但你想想,一群靠耍嘴皮子吃饭的人,居然想发明一套客观公正的裁判系统?这本身就挺讽刺的。更讽刺的是,他们搞出来的这套东西,两千多年后变成了计算机的底层语言。

自然语言太不靠谱,逻辑不得不换一种说法

如果你觉得逻辑就是“所有人都会死,苏格拉底是人,所以苏格拉底会死”这种三段论,那你对逻辑的理解还停留在两千年前。

问题出在自然语言本身。自然语言太暧昧了,一句话能读出八种意思。比如“Eric不相信Mary能通过任何考试”这句话里的“任何”,到底是指“所有考试”还是“某一场考试”?完全取决于说话人想怎么理解。

更离谱的是“我只借了你的车”这句话。重音放在“只”上、放在“你的”上、放在“车”上,意思完全不一样。你想想,如果逻辑推理建立在这么 slippery 的语言上,那还推个什么劲?

还有那个著名的“这句话是假话”悖论。如果它是真的,那它说的就是真的,所以它是假的;如果它是假的,那它说的就是假的,所以它是真的。来回打转,永远绕不出来。

逻辑学家们被自然语言折磨得够呛。他们意识到一件事:要想让逻辑靠谱,必须先发明一套全新的语言——一套没有歧义、没有悖论、每个符号只有一个意思的人工语言。

一个穷皮匠的儿子,把逻辑变成了数学

1847年,一个叫乔治·布尔的英国人出版了一本书,叫《逻辑的数学分析》。布尔出身贫寒,他爸是个皮匠,家里穷得叮当响。布尔全靠自学,一边教书一边啃数学论文。就是这么个穷小子,干了一件改变世界的事:他把逻辑变成了代数。

布尔发现,逻辑里的“且”和“或”,跟数学里的“乘”和“加”在结构上是一模一样的。比如a乘以b加c等于a乘b加a乘c,这个分配律在逻辑集合里也成立:x交上y并z等于x交y并上x交z。

这个发现太重要了。这意味着你可以用解方程的方式来搞逻辑推理。把“所有人都会死”写成数学式子,把“苏格拉底是人”写成数学式子,然后一通代数运算,啪,“苏格拉底会死”自己就蹦出来了。

布尔后来在1854年又出了一本书,叫《思维规律的研究》。他以为自己发现的是人类思维的底层规律。但他做梦都想不到,他发明的这套代数系统——后来叫布尔代数——一百年后会被用来设计计算机芯片。

讽刺吧?一个研究人类思维规律的哲学家,最后成了计算机硬件行业的祖师爷。今天全球每年花在芯片设计上的钱数以千亿计,底层跑的全是布尔那套只有0和1的逻辑。

数学家发现自己的地盘出了问题,只好请逻辑来救场

到了十九世纪末,数学本身出问题了。

1820年,大数学家柯西“证明”了一个结论:无穷多个连续函数加在一起还是连续的。六年之后,阿贝尔找到了一个反例——无穷多个连续函数加起来,居然可以是不连续的。整个数学界的脸都被打肿了。

问题的根源在于,数学家们一直在用自然语言描述数学概念,而自然语言太含糊了。比如说“无穷”到底是什么意思?以前没人说得清楚。

1879年,德国数学家弗雷格发表了一本书,叫《概念文字》。这本书的副标题是“一种模仿算术语言构造的纯思维的形式语言”。弗雷格的想法很简单:既然自然语言不靠谱,那我们就给数学造一套专门的人工语言。每个符号都有精确含义,每个推理步骤都按规则走,一步都不能含糊。

弗雷格的工作让数学证明的 rigor(严谨性)一下子提高了好几个档次。数学家们终于可以用精确的逻辑语言来描述“无穷”到底是怎么回事了。

然后康托尔就来了。他用弗雷格的这套新工具,干了一件让所有人都目瞪口呆的事:他证明了无穷大居然有不同的大小。有些无穷大比另一些无穷大更大。

康托尔用的是对角线证法。他假设所有自然数的子集可以排成一列,然后构造一个新的子集,这个子集保证不在原来的列表里,从而推出矛盾。这个证明漂亮极了,但也把数学家们吓坏了。无穷大居然还有等级?那最大的无穷大是哪个?

康托尔接着问了一个问题:自然数集的无穷大(记作ℵ₀)和实数集的无穷大之间,有没有一个中间大小的无穷大?他猜没有,这就是著名的连续统假设。

这个问题折磨了数学家整整半个多世纪。

希尔伯特想给数学装个永动机,哥德尔一脚踹翻了

1900年,大卫·希尔伯特——当时世界上最牛的数学家——提出了一个宏伟的计划。他想建立一个形式系统,把所有的数学真理都装进去,然后用一套机械化的程序,把所有真理一条一条地推导出来。

换句话说,希尔伯特想给数学造一台永动机:输入公理,转动摇把,所有的数学真理就会源源不断地流出来。

这个计划听起来很美,但有两个问题。

第一个问题来自罗素悖论。罗素发现,朴素集合论里有个悖论:所有不包含自己的集合组成的集合,到底包不包含自己?如果包含,那它就不该包含自己;如果不包含,那它就该包含自己。又是一个死循环。

罗素和怀特海花了整整十年,写了一部三卷本的《数学原理》,试图用一套层级化的集合系统来避开这个悖论。这部书从头到尾全是符号,没有一句人话,堪称人类历史上最晦涩的著作之一。

但真正把希尔伯特计划踹翻的,是哥德尔。

1931年,年仅二十五岁的哥德尔发表了一篇论文,提出了两个不完全性定理/不完备定理。第一定理说:任何一个足够强大到能做算术的形式系统,里面都必然存在一些命题,既不能证明为真,也不能证明为假;第二定理更狠:这样一个系统,无法证明自己是一致的——也就是说,它无法证明自己内部不会出现矛盾。

这就相当于说:你造了一台声称能生产所有真理的机器,但这台机器既不能证明自己不会爆炸,而且机器里还藏着一些永远生产不出来的真理。

希尔伯特的永动机梦碎了。

图灵和丘奇划出了计算机永远跨不过的线

哥德尔的工作启发了两个人:阿隆佐·丘奇和艾伦·图灵。

丘奇在1936年提出了λ演算,这是一种纯粹用函数来定义计算的形式系统。同年,他还证明了判定问题没有通用解法——不存在一个算法能判断任意一个数学命题是否可证明。

差不多同时,图灵发表了那篇著名的论文《论可计算数及其在判定问题中的应用》。图灵发明了一个思想模型——后来被称为图灵机——并且证明了停机问题是不可判定的:不存在一个通用算法能判断任意程序是否会停止运行。

图灵的证明用了一个非常漂亮的对角线技巧。假设存在一个程序H能判断任何程序是否停机,那我们就构造一个新程序D:D调用H来判断D自己是否会停机,然后故意做相反的事。如果H说D会停机,D就永远循环;如果H说D不会停机,D就立刻停止。矛盾。

丘奇和图灵独立工作,但殊途同归。后来人们发现,λ演算、图灵机、递归函数这三种模型在计算能力上是完全等价的。这就是丘奇-图灵论题。

这条线划得很清楚:有些问题,计算机永远解决不了,不是因为算得不够快,而是因为问题的本质就决定了不可能有算法。

逻辑在计算机里活成了四种样子

希尔伯特的计划虽然破产了,但逻辑并没有死。恰恰相反,逻辑在计算机科学里找到了新家。而且是以四种完全不同的方式活下来的。

第一种:硬件。

你今天手机里那颗芯片,里面有几十亿个晶体管。这些晶体管组成了逻辑门——与门、或门、非门。每个逻辑门执行的就是布尔代数里的一个基本运算。整个数字电路的设计,本质上就是在画一张巨大的布尔代数电路图。布尔当年研究的是“思维的规律”,结果他的代数成了硬件的语言。

第二种:复杂度理论。

1971年,斯蒂芬·库克和列昂尼德·列文独立提出了NP完全性理论。他们证明了有一类问题——比如旅行商问题、布尔可满足性问题——如果找到了快速解法,那所有这类问题都能快速解决。但问题是,没人知道到底存不存在这样的快速解法。

这就是著名的P vs NP问题,克雷数学研究所悬赏一百万美元求解。这个问题的本质是:有些问题验证答案很容易,但找到答案难如登天。逻辑帮我们精确地刻画了这道鸿沟。

第三种:编程语言和数据库。

SQL——就是那个你用来查数据库的语言——本质上就是一阶逻辑的一种方言。你写一条SELECT语句,背后运行的是一套逻辑推理引擎,从数据库里把符合条件的数据“推导”出来。

编程语言本身也需要形式语义——一套精确的规则,规定每行代码到底是什么意思。没有这套语义,不同的编译器会把同一段代码编译成不同结果,那整个软件行业就乱套了。

第四种:验证和AI。

1994年,英特尔奔腾处理器爆出一个浮点除法bug。在极少数情况下,芯片会算错除法。英特尔最初评估说这个错误大概九十亿次长除法才出现一次。但数学教授托马斯·尼科利在做孪生素数研究时撞上了这个bug。消息传开后,IBM停止销售搭载该处理器的电脑,英特尔被迫召回所有缺陷芯片,直接损失四亿七千五百万美元,总代价约三十亿美元。

如果当初英特尔用了形式验证——用逻辑严格证明芯片设计的正确性——这个bug在投产前就能被发现。但验证复杂芯片的所有可能状态,计算量之大让当时的技术望而却步。

今天,形式验证已经成了芯片设计和安全领域的标准工具。AI里的专家系统更是直接把人类专家的知识编码成逻辑规则,然后让机器自动推理。程序携带自己的正确性证明——这个概念叫proof-carrying code——正在改变网络安全的面貌。


逻辑从古希腊诡辩家的吵架裁判工具出发,走过了两千五百年。它先是被布尔变成代数,被弗雷格变成数学的语言,被哥德尔、图灵、丘奇划定了能力的边界,最后在计算机里找到了最终的归宿——不是作为哲学思辨,而是作为工业标准。

今天,每次你打开手机、每次你提交SQL查询、每次你依赖一个软件系统的正确运行,你都在消费两千五百年逻辑史的成果。你以为你在刷手机?不,你在跟亚里士多德、布尔、弗雷格、哥德尔、图灵和丘奇对话——他们发明的东西,现在就嵌在你手指底下的硅片里。