Hero Image
艾伦·图灵的一生

年表 19126 月 23 日生于伦敦。父母住在印度。 1926进入舍伯恩寄宿学校。 1930挚友克里斯托弗·莫科姆去世。 1931进入剑桥大学国王学院。 193522 岁当选国王学院院士。 1936写出《论可计算数》。前往普林斯顿。 1938在普林斯顿获得博士学位,回到剑桥。 1939开始在布莱切利园破译恩尼格玛。 1940第一台机电式“炸弹机”投入运行。 1945进入国家物理实验室,设计 ACE。 1948转到曼彻斯特大学。 1950发表关于模仿游戏的论文。 1952发表形态发生理论。因同性恋被定罪。 19546 月 7 日在威姆斯洛去世,终年 41 岁。 ◀ 上一站 沿路线走一遍 下一站 ▶ 1912 伦敦6 月 23 日生于梅达韦尔。父母住在印度,他由英格兰南部的一户寄养家庭抚养长大。 1926–1931 舍伯恩在寄宿学校结识克里斯托弗·莫科姆。这位朋友 1930 年的去世,使他开始思考心灵与物质的关系。 1931–1936 剑桥在国王学院学习,22 岁成为院士,写出《论可计算数》。 1936–1938 普林斯顿在阿隆佐·丘奇门下读博士。丘奇曾经由另一条路得到了同样的结果。 1939–1945 布莱切利园战争期间领导破译德国海军恩尼格玛的小组,并设计了机电式“炸弹机”。 1945–1947 特丁顿在国家物理实验室设计 ACE,一台存储程序计算机。 1948–1954 曼彻斯特为最早的计算机之一编程,提出模仿游戏,研究形态发生。1954 年 6 月 7 日在附近的威姆斯洛去世。 请启用 JavaScript 以查看地图。各站列在下方。 从伦敦到曼彻斯特,途经普林斯顿和布莱切利园。 地图:© OpenStreetMap 贡献者

Hero Image
图灵机:用铅笔、纸带和规则来计算

1936 年还没有任何计算机。英语里的 computer 指的是一个人:以计算为职业、用铅笔和纸在保险公司、天文台和政府部门里做算术的人。图灵就从这个人出发。他问:一个人在计算时真正在做什么?然后把一切不重要的东西都去掉。 计算的人还剩下什么 图灵在《论可计算数》中的推理,几乎就是一串简化: 纸可以换成一条分成格子的纸带,因为方格纸上的计算可以一格一格地抄到一行上。 每格里放一个符号,取自一张有限的清单:数字、字母、空白。 计算的人每次只看少数几格。看一格就够了:看几格,就是先看一格,再看它旁边那格。 计算的人有一种心理状态,比如“我在做加法”或“我在进位”。这样的状态只有有限多个。 每一步只取决于当前状态和正在读的符号。这一步就是写下一个符号、向左或向右移动一格、改变状态。 剩下的就是一台机器:一条纸带、一个能读能写的头,以及一张规则表。表的每一行说:“在某某状态下,读到某某符号,就写下这个,移到那边,进入某某状态”。 一台加 1 的机器 我们来造一台把二进制数加 1 的机器。手算 $1011+1$ 时,从右往左:最后一个 1 变成 0,“进一”;倒数第二个 1 也变成 0,再进一;接下来的 0 变成 1,计算结束。结果是 $1100$,也就是 $11+1=12$。 机器做的正是这件事,只需要一个状态“加”,外加终止状态“停机”。读写头从最后一位开始: 状态 读到 写下 移动 下一状态 加 1 0 向左 加 加 0 1 不动 停机 加 空白 1 不动 停机 第一行就是进位:把 1 换成 0,继续向左。第二行在遇到 0 时结束计算。第三行处理所有数字都是 1 的情形,比如 $111+1=1000$:读写头走到数字左边的空白处,在那里写下新的 1。 请启用 JavaScript 以使用这个交互图形。完整的推理见正文。 为什么这么简陋? 图灵机看上去简陋得可笑。它不能一次把两个数相加,除了纸带之外没有记忆,每次只走一格。但这种简陋是有意为之。图灵想要一个关于“机械计算”的定义,它要简单到没有人会怀疑一个人能执行它,同时又要普遍到涵盖任何计算。

Hero Image
停机问题:没有机器能回答的问题

1928 年,德国人大卫·希尔伯特提出了一个挑战,他称之为 Entscheidungsproblem,即“判定问题”:找到一种机械程序,对任何用逻辑语言写出的数学命题,都能在有限时间内回答它是真是假。如果这样的程序存在,数学就会变成一条流水线:只要写下问题,摇动手柄即可。 希尔伯特相信答案是肯定的。八年后,图灵和美国人阿隆佐·丘奇各自用不同的方法证明,答案是否定的。 一个更简单的问题 图灵没有正面进攻希尔伯特的问题。他先找到一个更朴素、却没有任何机器能回答的问题。今天人们这样讲述它: 给定一个程序和一个输入,这个程序终究会停机,还是会永远运行下去? 有时候很容易知道。把一个数加 1 的程序立刻就停。一个毫无出口地数 $1,2,3,\ldots$ 的程序永远不停。但有些很短的程序,谁也不知道答案。例如下面这个程序,它检验著名的哥德巴赫猜想——每个大于 2 的偶数都是两个素数之和: 从 $n=4$ 开始。 如果 $n$ 不是两个素数之和,就停机。 否则,把 $n$ 加 2,回到第 2 步。 这个程序停机当且仅当猜想不成立。知道它会不会停,就等于解决一个自 1742 年以来悬而未决的问题。一种判定程序是否停机的通用方法,可以一举解决这个问题以及许多其他问题。 证明 用反证法,假设存在一台机器 $P$ 能完成这项工作。它接收一个程序 $M$ 的描述和一个输入 $x$,并且总能在有限时间内回答: $$P(M,x)=\begin{cases}\text{“停机”}&\text{若 }M\text{ 在输入 }x\text{ 上停机},\\ \text{“不停机”}&\text{若 }M\text{ 永远运行}.\end{cases}$$有了 $P$,再造一台新机器——唱反调的 $D$。它接收一个程序 $M$ 的描述,然后这样做: 问 $P$:当 $M$ 收到它自己的描述作为输入时会怎样; 如果 $P$ 说“停机”,$D$ 就进入无限循环; 如果 $P$ 说“不停机”,$D$ 就停机。 致命的问题来了:当 $D$ 收到它自己的描述时,会怎样? 如果 $D(D)$ 停机,那么 $P$ 对 $D(D)$ 的回答是“不停机”,$P$ 错了。 如果 $D(D)$ 不停机,那么 $P$ 的回答是“停机”,$P$ 又错了。 两种情况下 $P$ 都出错。所以机器 $P$ 不存在。$\blacksquare$

Hero Image
可计算数:几乎每个数都无法计算

1936 年那篇论文的标题说的不是机器,而是数:《论可计算数》。图灵这样定义它们:如果存在一台机器,能一位接一位地写出一个实数的所有数字,而且永远不写错,这个实数就是可计算的。 哪些数是可计算的 学校里出现的数几乎都是可计算的。 分数: $\frac17=0.142857142857\ldots$ 机器做长除法,永远重复这个循环。 根式: $\sqrt2=1.41421356\ldots$ 为了找出下一位,机器从 0 试到 9,看哪个最大的数字添上之后,所得的数平方仍不超过 2。 $\pi$ 和 $e$: 有些级数能把它们逼近到任意精度,例如 $e=1+\frac1{1!}+\frac1{2!}+\frac1{3!}+\cdots$,借助这些级数,机器迟早能写出任何一位数字。 看起来,似乎每个“真正的”数都是可计算的。惊人之处就在这里:几乎没有一个是。 机器可以数得过来 每台图灵机都由一张有限的规则表描述。这张表可以用固定的字母表写成一段文字,因而也可以写成一个整数,图灵称之为描述数。只要把每个符号换成一个数字即可。 于是机器可以排成一张清单:描述数最小的那台,下一台,依此类推。许多数不描述任何机器,许多机器也不写出任何数,但这无关紧要。要紧的是:可计算数可以排成一张清单 $c_1,c_2,c_3,\ldots$ 用术语来说,它们是可数的。 实数数不过来 1891 年,格奥尔格·康托尔证明了实数不能排成一张清单。证明用的就是对角线。假设有一张列出 0 到 1 之间全部实数的清单: $$\begin{aligned} r_1&=0.\underline{5}\,1\,3\,9\ldots\\ r_2&=0.2\,\underline{7}\,0\,4\ldots\\ r_3&=0.8\,8\,\underline{1}\,6\ldots\\ r_4&=0.3\,0\,2\,\underline{2}\ldots \end{aligned}$$改动对角线上的数字来构造一个数 $d$:遇到 5 就写 6,遇到其他数字就写 5。这里 $d=0.6555\ldots$ 这个 $d$ 在第一位与 $r_1$ 不同,在第二位与 $r_2$ 不同,在第 $n$ 位与 $r_n$ 不同。它不在清单上。所以没有任何清单能包含全部实数。 把两个事实放在一起:可计算数能排成清单,实数不能。于是有实数落在所有机器之外,而且它们占了绝大多数。如果你随机挑一个实数,它是可计算数的概率为零。 一个能定义却算不出来的数 可以给一个不可计算的数起名字。写下 $0.d_1d_2d_3\ldots$,其中如果清单上的第 $n$ 台机器在空白纸带上会停机,就令 $d_n=1$,否则令 $d_n=0$。这个数定义得清清楚楚。但如果有一台机器能写出它的各位数字,它就解决了停机问题,而这是不可能的。这是一个存在着、却永远没有人能写出来的数。 练习:用一用对角线清单开头是 $0.1234\ldots$、$0.5555\ldots$、$0.9090\ldots$、$0.3141\ldots$。用“5 变 6,其余变 5”的规则,写出对角线数的前四位。 对角线是 $1,5,9,1$。改动后:$1\to5$,$5\to6$,$9\to5$,$1\to5$。这个数是 $0.5655\ldots$,它在对角线那一位与这四个数各不相同。

Hero Image
通用机:程序也是数据

每台图灵机只做一件事。加 1 的机器就加 1;写 $\frac17$ 的机器就写 $\frac17$。要做别的计算,就得换一台机器。在 1936 年,这是常态:机械计算器、穿孔卡片制表机和潮汐预测机都是为一项任务而造的,换任务就意味着换机器或重新接线。 在同一篇论文里,图灵证明了这并非必要。 读机器的机器 任何机器的规则表都可以作为文字写在纸带上。于是图灵描述了一台特殊的机器 $U$——通用机,它这样工作: 在纸带上接收一台机器 $M$ 的描述,后面跟着一个输入 $x$。 在描述中查找与 $M$ 当前状态以及 $M$ 正在读的符号相对应的规则。 在代表 $M$ 的纸带的那部分上执行这条规则,记下新状态,回到第 2 步。 这样,只要收到任何一台机器的规则表,$U$ 就能一步一步地模仿它。用符号写: $$U(\langle M\rangle,x)=M(x)\quad\text{对每台机器 }M\text{ 和每个输入 }x.$$代价是慢:$M$ 的每一步,$U$ 都要用许多步去查找和抄写。但 $U$ 能算的,恰恰是所有机器合起来能算的。 程序放进内存 实际的推论就是存储程序的思想。不必为每项任务造一台机器,只造一台,任务作为数据输入,放在存数字的同一个内存里。换任务就变成了换文字。你在手机上打开一个应用时正是如此:设备总是那一台,变的是它读的描述。 更进一步:如果程序是数据,一个程序就可以读、写、修改别的程序。编译器和操作系统做的就是这件事;从某种意义上说,停机问题证明中那台接收自身描述的机器 $D$ 也是如此。 Pilot ACE,图灵设计的缩小版,在国家物理实验室建成,1950 年投入运行。它现在陈列于伦敦科学博物馆。Philafrenzy · Wikimedia Commons · CC BY 2.0 从纸上到金属 战后,1945 至 1946 年,图灵在国家物理实验室写出了一台存储程序计算机——ACE(自动计算引擎)——的完整设计。这个设计很大胆:用水银延迟线做内存,每秒一百万个脉冲,甚至设想机器可以编程修改自己的指令。官僚作风和工程师的短缺拖慢了建造。缩小版的 Pilot ACE 直到 1950 年才运行起来,有一段时间它是世界上最快的计算机之一。 与此同时,在曼彻斯特,弗雷德里克·威廉姆斯和汤姆·基尔伯恩于 1948 年 6 月 21 日,在一台绰号**“宝贝”**的机器上运行了第一个存放在电子内存中的程序。几个月后图灵来到曼彻斯特,参与了此后几台机器的工作。

Hero Image
Calculemus:用计算来推理

纠正我们推理的唯一方法,是让它们像数学家的推理一样具体可感,使我们一眼就能发现错误;而当人们发生争论时,我们只需说一声:让我们来计算吧!不必多费口舌,就能看出谁是对的。 — 莱布尼茨,《发现的艺术》(1685) 莱布尼茨是律师、外交官和哲学家。他一生目睹了无数永无休止的争论:宗教之间、国家之间、哲学流派之间。而数学家不会争论 $2+2$ 是否等于 4,只会去算。如果推理也能像数字一样被计算呢? 思想的字母表 这个计划分为两部分。 第一部分是一种通用语言,莱布尼茨称之为 characteristica universalis(普遍文字)。在这种语言里,每个简单观念都有一个符号,复杂观念则是这些符号的组合,就像单词由字母组合而成。莱布尼茨 20 岁时在 1666 年的《论组合术》中就开始构思它。 第二部分是一种推理演算,即 calculus ratiocinator:一套操作符号的规则,让人像做加法一样机械地得出正确结论。在那样的世界里,争论可以用纸和笔来解决。 把概念当作质数 莱布尼茨真的尝试过一个用数字的版本。想法是:给每个简单概念分配一个质数,给每个复合概念分配其组成部分的质数之积。 例如,按照经典定义,“人是理性的动物”。如果动物 $=2$,理性 $=3$,那么人 $=2\times3=6$。 于是,“所有人都是动物”这句话就变成一个算术问题:**2 能整除 6 吗?**能,所以这句话为真。那“所有动物都是人”呢?**6 能整除 2 吗?**不能,所以为假。关于概念的推理变成了一道除法题。 这个系统有严重的问题,它处理不好否定和“有些”这类句子。莱布尼茨知道这一点,并不断尝试其他形式。但核心思想——逻辑可以是代数——已经提出来了。 用今天的记号举例 今天我们用逻辑符号书写推理。考虑关于一个图形的三个命题: $P$:这个图形是正方形; $Q$:这个图形是矩形; $R$:这个图形的两条对角线等长。 如果 $P\Rightarrow Q$(所有正方形都是矩形)且 $Q\Rightarrow R$(所有矩形的对角线都相等),那么 $P\Rightarrow R$。结论来自论证的形式,根本不需要去想正方形。这正是莱布尼茨想要的:只看符号就能检验推理。 但符号不会创造奇迹。如果前提是错的,计算再正确,结论也可能是错的。而颠倒蕴含关系是常见的错误:由“所有正方形都是矩形”推不出所有矩形都是正方形。 组合不等于解释 三个命题,每个或真或假,共有 $2^3=8$ 种组合:000、001、010、011、100、101、110、111。注意,这正是 0 到 7 的二进制写法。逻辑与 0、1 构成的数之间的联系,莱布尼茨已有所察觉,两个世纪后它将成为核心。 部分实现的梦想 莱布尼茨关于逻辑的著作几乎全部未发表,直到 19 世纪。尽管如此,这个想法又回来了: 1854 年,乔治·布尔出版《思维规律》,把逻辑变成了一种只有 0 和 1 的代数。 1879 年,戈特洛布·弗雷格创造了一套完整的逻辑符号语言,与莱布尼茨的设想非常接近。 1936 年,艾伦·图灵描述了一种抽象机器,能执行任何用规则描述的计算。 然而在 1931 年,库尔特·哥德尔证明了:没有任何规则系统能判定数学中的所有真理。莱布尼茨完整的梦想是不可能实现的。但其中可能的那一部分就存在于每台电脑里:一个按规则操作符号的机械装置。

Hero Image
艾伦·图灵的遗产

图灵相信机器会思考。图灵和男人睡觉。所以机器不会思考。 — 艾伦·图灵,致诺曼·劳特利奇的信(1952) 这个苦涩的三段论,是图灵在被定罪后不久写给一位朋友的,它概括了他的一生:一个用逻辑思考的人,被不理解他的人审判。然而,他留下的成果无处不在。 在计算机科学中 图灵机仍然是“计算”的正式定义。当计算机科学家说一个问题“没有算法”时,意思是没有图灵机能解决它;当他们说一个问题“难”时,数的是图灵机需要走多少步。 从这种计数中产生了这个领域最著名的问题——P 与 NP:每个解很容易验证的问题,是否也都很容易找到解?拼一幅拼图很难;检查一幅拼好的拼图很容易。没有人知道这种差别是真实存在的,还是只是我们不够聪明。克雷研究所悬赏一百万美元,奖给回答这个问题的人。 自 1966 年起,美国计算机协会每年颁发图灵奖,它被视为计算机领域的诺贝尔奖。 在密码学和统计学中 对恩尼格玛的战争表明,一种密码的安全不在于密钥的数量,而在于没有能一下子排除大部分密钥的缺陷。现代密码学就诞生于这个教训。而分班经由 I. J. 古德,帮助把贝叶斯统计带回了科学的中心。 在生物学和人工智能中 形态发生的方程是一整个领域——图案的数学生物学——的基础。而模仿游戏在机器已经能够对话的今天,仍是任何关于机器能否思考的讨论的参照。 曼彻斯特萨克维尔公园里的图灵雕像,2001 年揭幕。他坐在长椅上,手里拿着一个苹果。David Dixon · Wikimedia Commons · CC BY-SA 2.0 补偿 几十年里,图灵在战争中的工作是国家机密,他的定罪则是不被提起的话题。1983 年,数学家安德鲁·霍奇斯写的传记出版,情况开始改变。随后有了: 2001 年,在大学旁边的一座公园里,竖起了曼彻斯特的雕像; 2009 年,英国政府的道歉; 2013 年的王室赦免,以及 2017 年赦免其他被定罪者的法律; 印有他头像的 50 英镑纸币,于 2021 年 6 月 23 日——他的生日——发行。 要记住的 1936 年:图灵机定义了什么是计算,通用机预示了存储程序计算机。 1936 年:停机问题表明有些问题没有机器能回答,可计算数表明几乎每个实数都遥不可及。 1939–1945 年:恩尼格玛的计数与缺陷、炸弹机,以及带着分班的班伯里法。 1950 年:模仿游戏用一个测试取代了“机器会思考吗?”这个问题。 1952 年:形态发生解释了扩散如何产生图案。 练习:验证很容易有人说 $8633=89\cdot97$。验证它要花多少功夫?如果没有提示,要找到这两个因数又要花多少功夫? 验证只需一次乘法:$89\cdot97=89\cdot100-89\cdot3=8900-267=8633$。寻找则要试除到 $\sqrt{8633}\approx93$ 为止:从 2 到 89 一共 24 个素数,只有最后一个成功。对于几百位长的数,验证仍然瞬间完成,寻找却变得不可行。互联网的密码学就建立在这种不对称上。

Hero Image
布尔、弗雷格与皮亚诺:把推理写下来

直到十九世纪,数学记号都是用来写量以及量之间的运算的。还缺少一种书写,用来记录数学家时时刻刻都在做、却从不写下来的事:推理。“如果这样,那么那样”;“对所有的数”;“存在一个数,使得”。这些话仍然要用拉丁文、法文或德文,夹在一个公式和另一个公式之间说出来。这篇文章讲的是推理本身如何得到了符号。 思维的代数 十九世纪,数学开始向内审视:什么是数?什么是证明?要回答这些问题,就需要一种书写,不仅能写量,还能写命题以及命题之间的推导步骤。 1854 年,英国人乔治·布尔出版了《思维规律》,把推理当作代数来处理。如果 $x$ 代表“白色的东西”,那么 $x\cdot x$(白色的东西中白色的那些)就是 $x$ 本身。于是有了布尔代数中那条奇怪的定律: $$x^2=x,\qquad\text{也就是}\qquad x(1-x)=0,$$布尔把它读作“任何东西都不能同时具有又不具有某种性质”。一个世纪以后,这种只有 $0$ 和 $1$ 两个值的代数,成了计算机电路的基础。 1879 年,德国人戈特洛布·弗雷格走得更远。在《概念文字》(Begriffsschrift)一书中,他创造了一套完整的逻辑语言,能够一步一步地表达任何数学证明。这是了不起的成就,但这种书写是二维的:命题挂在横线和竖线上,像一棵横躺着的树的枝杈。一个简单的公式就要占半页纸。同时代的人觉得它无法阅读,几乎没有人读这本书。 一种天才而贫瘠的记号 弗雷格的思想流传了下来,他的书写却没有。在弗雷格工作的基础上前进的伯特兰·罗素和阿尔弗雷德·诺思·怀特海,选择用意大利人朱塞佩·皮亚诺的线性记号来写《数学原理》(1910–1913)。在《数学原理》中,通向 $1+1=2$ 的那个命题直到第一卷第 379 页才出现,还附了一句干巴巴的评语:“上面这个命题偶尔是有用的。” ∈、∃ 和 ∀ 我们今天使用的逻辑符号,有很大一部分要归功于皮亚诺。1889 年,为了表示一个元素属于一个集合,他用了希腊字母 epsilon,取自希腊语 estí(“是”)的首字母:$3\in\mathbb{N}$ 读作“$3$ 是一个自然数”。1897 年,为了表示存在一个具有某种性质的元素,他用了一个反转的 E:$\exists$。“对所有”的 $\forall$ 是最年轻的:1935 年,德国人格哈德·根岑仿照 $\exists$,把 A(德语 alle,“所有”)倒过来,创造了它。 在一个带量词的命题中,量词、论域和性质扮演不同的角色。为本书绘制的教学示意图。 有了这些符号,“每个实数的平方都大于或等于零”这句话就变成了 $$\forall x\in\mathbb{R},\quad x^2\ge 0.$$看起来只是缩写,但这种书写让日常语言所隐藏的东西变得可见:量词的顺序。比较: $$\forall x\ \exists y:\ y>x \qquad\text{和}\qquad \exists y\ \forall x:\ y>x.$$第一个说:对每个数,都存在一个比它大的数,这是对的。第二个说:存在一个比所有数都大的数,这是错的。在日常语言里,两者都可以塞进一句含糊的话:“总有一个更大的数”。在逻辑书写中,区别就在符号的位置上,一眼就能看出来。 本章说明了什么 从印度的零到根岑的量词,数学书写中每一次重要的变化都开辟了一条新路。位值制把计算变成纸上的工作;韦达的字母把算法变成了对象;纳皮尔的对数把乘法换成加法;莱布尼茨的 $d$ 让链式法则自己写出来;欧拉的 $f(x)$ 给了函数一个名字;伽罗瓦和凯莱的表把运动变成了符号,矩阵把一个方程组当作一个整体;吉布斯和亥维赛的向量把麦克斯韦方程化成四行;量词让命题的结构显现出来。