## 《柏拉图和技术呆子》4:宇宙是计算机吗？（上）

> 万维钢
> 本周我们继续讲爱德华·Lee 的《柏拉图和技术呆子》这本书。
> 首先请允许我说几句题外话。Lee 的这本书，和我们专栏前面讲过的布鲁萨德的《人工不智能》，都是麻省理工学院出版社（The MIT Press）出的。我发现这个出版社出的书，都是你一看书名特别感兴趣，但是买回家发现非常非常难读。作者都是“来自生产一线”的科学家和教授，这帮人非常有思想，但是根本不会写书。麻省理工学院出版社好像完全不在乎书的销量。
> 我要说明的就是 Lee这本书的前半部分和后半部分几乎没什么关系。前半部分讲计算机工程师的智慧，后半部分则是从理论上探讨计算机这种东西的局限性。如果是咱们得到的主编操盘，肯定要求他把这些内容变成两本书分开卖。Lee 完全不讲写作的章法，我作为一个书呆子读得也很痛苦。他竟然在前言说他也不知道有谁会读他这本书 —— 得到主编要是去了MIT出版社肯定火冒三丈。所以我很希望你买一本自己读一下 —— 你会体会到“得到”和我的价值。
> 但是这本书中说的内容非常重要，作者拥有一线的见识，而且下了很大的调研功夫。特别是这个后半部分，本周我们要重点讲一个特别大的大道理，足以影响你的世界观和人生观。这个道理来自深刻的数学，但是距离我们每个人又都很近。我这几天走在大街上都想抓住一个人告诉他这番道理。
> 我将用由浅入深的方法彻底给你讲明白。你不需要多少数学知识，但是你需要思考。

工程师做的都是模型，计算机也是一种模型。但是对一个模型琢磨的久了，你难免就会觉得它不仅仅是一个模型。

比如你可能会问，人脑……也是一台计算机吗？

这种问题跟工程师怎么报效祖国没啥关系。可是作为一种智识上的兴趣，每个人都会忍不住关注这些问题。这个问题涉及到“图灵机”、信息论和“哥德尔不完备性定理”，你肯定早就听说过这些概念了，我们这里想给你一个统一的解释。

我们将通过计算机科学的眼光，理解这个世界。

人脑和计算机的关系我们专栏说过好多次了，我保证这次给你一个更高级的答案。在回答人脑是不是计算机之前，我们要先问一个更大的问题。

—— 这个宇宙是计算机吗？

有一种猜想认为我们以为的这个“现实世界”，其实是某个更高智能的计算机模拟 —— 我们其实是生活在一个网络游戏里。如果你觉得这个猜想太过离奇，我还可以换个说法：请问我们生活的这个现实世界，在理论上，可以用一台要多强大就有多强大的计算机来完全模拟吗？

这个问题可不仅仅是个好玩的思想实验。我们需要理解计算机的本性，并且跟真实世界的本性做一个对比。使用计算机视角，你会重新认识这个世界。

而你可能想不到，这一切要先从“实数”开始讲起。

每个中学生都学过各种“数” ——

“自然数”是 0，1，2，3，……

“整数”是自然数加上负的自然数：……-3，-2，-1，0，1，2，3……

“有理数”则包括了分数和小数，但要求必须是有限的、或者是无限但是必须循环的小数 —— 本质上，所有有理数都可以写成分数，也就是两个整数相除：1/2，1/3，4/3 ……

在说实数之前，我先问你一个问题。你说到底是自然数多呢？还是自然数里的“偶数”多呢？

人的直觉反应肯定是自然数比偶数多。偶数 —— 0，2，4，6，8，……—— 只是自然数的一部分，自然数里还有1，3，5，7这些奇数，整体肯定比部分多啊。但是请注意，自然数和偶数都有*无限多*个。无限多的两种东西，怎么比较多少 —— 无限大和无限大到底哪个大，这是一个问题。

德国哲学家格奥尔格·康托（Georg Cantor）曾经为此思考了整整12年。大概是1874年，康托提出，自然数、自然数中的偶数、甚至一切有理数，都是一样多的。

![图片](https://piccdn3.umiwi.com/img/201807/15/201807151711426243285202.png)

康托的洞见在于两个集合的元素如果能一一对应，那这两个集合的元素个数就一样多。

每个偶数除以2就是一个自然数，偶数和自然数可以一一对应 ——

0 ↔ 0,

2 ↔ 1,

4 ↔ 2,

6 ↔ 3,

……

同样道理，全体整数的个数也和自然数的个数是一样多的，因为我们可以把整数按照一定的规律“数出来”，也就建立了跟自然数的一一对应 ——

0 ↔ 0，

-1 ↔ 1，

1 ↔ 2，

-2 ↔ 3，

2 ↔ 4，

-3 ↔ 5,

3 ↔ 6,

……

数学上这叫“可数”。一个包含无限个元素的集合只要是“可数”的，它就能跟自然数一一对应，它的元素个数就跟自然数一样多。

事实上，有理数的集合也是可数的。比如我们可以按照下面这张表格，把全体有理数列举出来 ——

![图片](https://piccdn3.umiwi.com/img/201807/15/201807151713181599329607.png)

无非就是把每个有理数都写成分数的形式，然后根据分子、分母的数字决定它在表格上的位置。只要按照图中箭头的方式，我们就可以把全体有理数数一遍。你一边数着有理数，一边数着自然数，这就建立了一一对应的关系：所以有理数也和自然数一样多。

现在轮到“实数”了。所有有理数都是实数，而实数还包括“无理数”，也就是小学老师所谓的“无限不循环小数”。无理数的特点是不能写成分数的形式，也就是不能用两个整数相除得到。比如根号2和圆周率π就都是无理数。

具体怎么证明我就不说了，但是数学上有个结论：无理数，是“不可数”的。

也就是说，实数不能跟自然数做一一对应。虽然自然数和实数都有无限多个，但是这两个无限不是一个级别 —— 实数比自然数要*多得多*。如果你说自然数是“无穷多”，那实数就是“不可思议的多”。

好，今天的数学就这么多。你可能会说，这些都是一百多年前的人就知道的数学，现在对很多人来说都是常识，那说这些有啥意义呢？

意义就在于，实数是不可数的，而计算机的一切，都是可数的。

咱们先约定一下。这个系列里凡是说“计算机”，就都特指我们现在都在用的、基于图灵机的这种寻常的计算机。如果我想说另一种会做计算的机器，那就叫“机器”。

理论上讲，只要有足够多的内存、给足够多的时间，一台计算机就可以完成任何“算法”。但是计算机对算法有三个要求。这些要求就决定了，计算机和真实世界似乎是有区别的。

第一个要求是算法必须是“数字化”的。计算机所有的输入和输出，中间计算过程中涉及到的所有数，都必须是能用有限多个数字描写。也就是说要么是整数要么是有限位的小数。换句话说计算机只能处理有理数。

比如说圆周率π。计算机里没有真正的圆周率。你要输入圆周率，只能输入一个有限位的近似的小数，3.141592653……到一定长度你必须停下。你可以用计算机把圆周率算到任意精度，但是总要在算到某一位的时候停下来。只要你停下了，你算的那个数就是一个有理数，而不是真正的π。

第二点要求是，算法是一步一步的。计算机不能算*连续*。所有计算机程序都按照“步”运行，这一步干什么、下一步干什么。你要模拟一个足球的运动，必须先把时间和空间分成若干“小步”，让足球每次走一步。当然你可以把步分得很细 —— 但是一旦确定了步，一步就是一步，没有“半步”的中间状态。

这是因为计算机的底层是一个开关网络。晶体管要么是开要么就是关，没有半开半关的状态。

真实世界好像不是这样的。你挥一挥手，让手从A点到达B点，这应该是一个连续的运动 —— 你的手似乎应该经历了从A点到B点之间每一个距离数字 —— 其中既有有理数也有无理数。而计算机模拟的你的手，只能经历有理数。

第三点要求是，图灵机必须停机。给一个算法，它一定要算出一个结果来。从这个意义上讲现在的计算机都不是严格的图灵机。比如我们用的个人电脑的操作系统，在理论上都可以永远不停机。你还可以跟电脑做交互式的操作，这就更不是图灵机了。而真实世界，当然也是交互的。当然电脑里运行的每一段代码，都符合图灵机的要求。关于图灵机的停机问题我们先不细说。

那么根据这些要求，计算机程序就一定是有限长的、而且是数字化的操作。事实上，所有计算机程序都可以翻译写成由0和1组成的代码，硬件层面就是这么操作的。

所以计算机程序必定是可数的。比如我们可以按照下面这个方法列举所有的计算机程序 ——

0

1

01

10

00

11

000

001

……

规则是按照长度，在每个长度下列举0和1的所有排列组合。当然其中很多代码根本就不是正确的计算机程序，但这我们不在乎，我们只要确保这个数法已经包含了所有可能的计算机程序就行。

所以说，计算机程序的集合，是个可数的集合。那计算机能做的事情，就是可数的。

那请问，真实世界里的事情也是可数的吗？真实世界里有没有实数呢？

如果真实世界里有些不可数的事情，如果真实世界里有些数必须是实数，那计算机怎么可能完全模拟真实世界呢？

咱们明天继续。

![图片](https://piccdn3.umiwi.com/img/201807/15/201807151725279826005219.jpg)
