1. 图灵机
据说牛顿在树下被一只苹果砸中,因此想到了万有引力。当20世纪上半叶的数学家们思考关于计算的问题时,小孩子写的如下图所示的乘法算式会不会给他某种提示?
图1 一个计算的示例
是的,在如今的计算机科学家看来,这样简单的算式的确蕴含了计算的本质。1940年代的图灵为了说明什么是计算的本质,发明了图灵机。图灵机是个抽象的机器,这个机器的下方有一个读写头,读写头可以读写一个纸带,纸带上面有很多字符。读写头可以读取当前字符,也可以把它改写为任意指定的字符。
图2 图灵机示例
在图灵机内部有一个状态,图灵机可以把自己从一个状态任意转换为另一个状态。
关于图灵机,有以下说明:
- 图灵机内部的状态是有限的。
- 字符集是有限的。
- 读写头一次只能读或者写一个字符,并且不能同时读写。
- 纸带两头都是无限的。
这台机器也有指令和程序。不过千万不要跟如今计算机里的指令和程序相混淆。图灵机的指令有以下几种:
- 读当前字符
- 写当前字符
- 根据当前字符和当前状态转换状态。比如(0, 'A')->3表示在状态0情况下,如果当前字符等于A则把状态改为3
- 把纸带向左移动一格
- 把纸带向右移动一格
- 开机和停机
然后就没有然后了,图灵机的指令集合就这么简单。接着你就可以写程序了,程序中可以使用条件和goto,比如:
- 开机
- 如果当前字符是'A',goto 5
- 如果当前字符是'B',goto 7
- 如果当前字符是'C',停机
- 纸带左移
- goto 1
- 纸带右移
- goto 1
除了量子计算之外,现在的计算机本质都是上述图灵机或者图灵机的特例。图灵对计算的定义是,给定一个图灵机的初始状态,以及纸带上的初始内容,指定有限的字符集和状态集,一个指定的有限的程序在该图灵机上运行到停机后纸带上的内容被称为可计算的。
这就是图灵通过图灵机告诉我们的计算的本质。这意味着,图1所示的乘法计算可以转化为一个图灵机和一段程序。当然,这种转化是很有难度的,比如,图1中输入数据和计算过程其实是二维的,要转为一维的才行。
2. 递归可枚举
后来的计算机科学家又对计算给出了不同的定义,比如递归可枚举集合。什么是递归可枚举?举个例子。对于自然数集合N={0, 1, 2, 3, ......}来说,偶数是这样定义的:
- 0是偶数
- 如果a是偶数,则a+2也是偶数
所以偶数集合是递归可枚举的,所以它是可计算的。
也就是说,在有限的、递归的规则指导下生成的集合A称为递归可枚举集合,A就是可计算的。注意,这是可计算的一个充分条件而非必要条件。在递归可枚举概念下,还有一种情况是可计算的:如果A、B都是可计算的,则A-B也是可计算的。
比如上述自然数集合N和偶数集合都是可计算的,则前者与后者的差,即奇数集合也是可计算的。
所以,所有素数的集合是可计算的(为什么?应为所有合数的集合是递归可枚举的,所以它在自然数集合中的补集即所有素数的集合也是可计算的),斐波那契数列是可计算的,围棋也是可计算的!
计算机科学家已经证明,上述对可计算性的定义与图灵机是等价的。两者的共性在于,使用有限的字符集和有限可扩展的规则。
3. 结束语
事实上,人类现在和将来所掌握的知识都是有限的,这一点与动物并没有什么本质区别。但是人类可以递归地应用所掌握的知识,这是动物们所不具备的能力。比如,人类可以根据现有知识,不必亲自到场测量,就知道几亿光年之外恒星上的物质与太阳没什么区别。人类在此基础上,不断地归纳和扩充自己的知识,但是,人类永远都只能无限接近真理,而不能完全掌握真理。