图灵机杂思
(rev#2)
By
刘未鹏
C++ Template是图灵完备的
(
turing-complete
,或者更确切的说,是图灵等价(
turing-equivalent
)),关于这一点是没什么悬念的,只是前几天有位朋友问到为什么说
C++ Template
是图灵完备的,为了找出当初的连接,于是又去搜了一下
wikipedia
和
standford encyclopaedia
,谁之这一搜之下又带出了一大堆内容,于是又花了好几个时辰将图灵机的相关理论复习了一遍,顺便以四十五度角仰视了一下
Alan Turing
的生平,神奇的是在追寻链接和搜索的过程中居然翻到了一篇关于
constructive mathematics
以及一篇关于
Intuitionistic Logic
的东东,那是后话,暂且不提。先来说说
C++ Template
和图灵机。
图灵机是图灵为了研究可计算问题而构思的一个理论装置,你只要想一想有限状态机就可以大概知道图灵机是个什么概念了,只不过图灵机的内存(纸带)是潜无穷的(也就是可以任意长啦,
“
潜无穷
”
是古稀蜡人的说辞)。图灵机的定义形象的说来就像老式的电传机:一个读写头,一根纸带(可能任意长),读写头不断读取纸带上的符号,并根据内在的状态转换规则转换当前状态,同时进行一些动作,譬如插除或改写当前字符,向前
/
向后移动读写头或保持不动等。至于其抽象的定义大抵就是
有限状态机
的定义了。
图灵机的这一定义现在我们看起来似乎是很显然的,然而当时却代表着一种思想上的革命,一种从无到有。图灵机实质上抽象出了我们平素进行机械式计算的核心规律,所以才等价于
“
一个人
+
纸笔
+
一定的规则
”
所
进行的机械运算。
这么个理论机器首先就指明了创建计算机的可能性,然而这还不够,如果为了某一个问题就去创建一个特定的图灵机的话效率就太低了。图灵机理论的一个最美妙的结论就是存在
“
元图灵机
(
Universal Turing-Machine
,直译应为一般图灵机
/
通用图灵机,然而
“
元图灵机
”
更精确地表达了其意思),所谓元图灵机其实就是把图灵机作为运算对象的图灵机,假设有一个元图灵机
M
,一个图灵机
P
以及
P
的输入数据
D
,那么将
(P, D)
喂给元图灵机
M
,
M
就能够吐出
P(D)
(即
P
在
D
上的结果)。而这便是现在我们所用的计算机的始祖模型,其中
M
就好比我们的计算机(元图灵机),
P
则是程序(编码后的图灵机),
D
则是程序
P
的输入数据。元图灵机的存在表明了我们可以用一台机器来解决所有图灵可计算(
turing-computable
)的问题
——
只要喂给它解决这个特定问题的图灵机编码(程序)以及问题的输入数据即可,该元图灵机就会模拟我们喂给它的那个图灵机
P
的行为,最终给出结果。元图灵机的存在性为计算机的诞生点燃了一盏明灯,这是图灵机理论中最漂亮的发现。
关于图灵机还有两个有名的
Halting Problem
和
Busy Beaver Problem
,不过前者更有名,但没有后者有意思,所以具体就不说了,可以
google
。这两个问题说明了图灵机并不是
“
万能
”
的,它只能解决可以
“
机械地
”