你被关在在一个房间里,房间里挤满了很多台机器。对于你眼前的一台机器P,有一个小矮人坐在机器前,不断地向机器里敲打着序列,这时机器大声地喊了一句”hello world!”,说明条件满足了 。如果机器没有动静,说明输入的序列并不满足让它大喊的条件。对于每一台机器来说,它们满足的条件各不相同。

我告诉你,你的任务是,造出一台超级机器,这样你才能够出去。这台机器我要求对于房间里任意的一台机器和对应的输入,如果这台机器能够喊出”hello world”, 那么超级机器就会说”yes”, 如果这台机器不能”hello world”, 那么超级机器就会说”no”。

这看起来是个很简单的任务,因为超级机器只需要判断其他机器能不能喊”hello world”就可以了。这时候,我又对你提出了新的要求:”如果超级机器判断的机器没有喊’hello world’ ,那就让这台超级机器代替它喊一句’hello world’。”

好像和之前的任务也没什么差别,只是改变了喊话的内容而已。

现在我告诉你,对于某一台机器来说,你输入的序列,也完全可以是那台机器本身。什么意思呢,其实说到底,这里说的机器并不是实际存在的东西,而是一串序列,这听上去有一点恐怖,你能够把机器编成一串序列,让小矮人把这个序列敲到机器里。

总之,小矮人们不太情愿地把这个序列敲进了机器,对于机器接下来会怎么样,小矮人也不清楚。但这时候你会发现,有些机器发出了”hello world”, 有些机器十分安静。说”hello world” 或是不说,就这两种结果。

对于超级机器来说,你大概发现了,这台机器至少要有两个输入,也就是说,一个小矮人输入的是你要判断能不能发出”hello world” 的那台机器(所代表的序列P),而另一个小矮人要输入你要输入到待判断的机器里的那个序列I。

但是现在我说,没必要再找两个小矮人,直接让你来,输入的序列就是机器代表的序列,不需要输入I了,机器也不需要有两个输入口,一个就够了。相当于说,之前说的两个输入,都是机器代表的序列P。你会输入两次机器代表的序列P,但是,鉴于这台超级机器只有一个输入,那么当你第一次输入P时,这台只由你控制的机器也会有一个输出,也就是说,当你输入P的时候,这台超级机器也有可能因为满足它自身的条件而大喊”hello world”。

我想你可能也想不出来这样的机器要怎么做,但总之,我指着角落的一台机器,告诉你,其实那台机器就是超级机器。我让你过去,并且我告诉了你超级机器所代表的序列。

“输入吧。” 我说。

你开始敲打超级机器代表的序列,就像把超级机器自己塞进了自己的输入口里。

但最终你发现了,我骗了你,那台机器根本就不是超级机器。

如果这台超级机器,输入自己的序列,喊出了”hello world”, 那么根据最开始定义的规则,它会喊出”yes”, 而如果这台超级机器输入自己的序列并没有发出声音,按照定义,它输入的机器没有喊出”hello world”的时候,它会代替输入的机器,喊出”hello world”。

这根本不可能,超级机器根本没办法造出来。就是这样,你没法逃出房间。


今天计算理论讲了停机问题,感觉非常有意思,于是写了一个小故事,尽可能简单地解释出这一构造的巧妙性,但是可能会有交代不清的地方,欢迎指正~

另外,关于停机问题,老师还扯到了很多有意思的东西,非常之”哲学”。

比如说,如果故事里的机器是杀毒软件的话,其实可以发现,杀毒软件是不能够检测出所有的病毒的,因为它不能知道自己是不是就是病毒(细思极恐)。而且停机问题的推导其实涉及到了一种自我指涉的矛盾。说到”自我”,其实就会发现,按照这样的逻辑,一个人是无法完全认识自己的,或者说一个人是无法完全理解自身的。

如果故事里的机器是我们的脑子,用我们的脑子去研究我们的脑子,其实就会有不能够认识到的地方。脑子是研究的主体,也是研究的客体;就像机器作为程序,但同时又作为程序的输入,而这时候你是不能认识到机器的输出的,所以你其实不能认识到这种脑子研究脑子的正确性甚至是可行性。所以说这就某种程度上支持了不可知论。