部分递归函数(Partial Recursive Function)
定义图灵机不单单是为了好玩,还为了研究什么样的东西才是“可计算”的。从图灵机“一步一步”操作的方式来看,好像任意函数都能被计算。但实际上,只有某一类函数可被图灵机计算。这类函数被称作部分递归函数,与图灵机可计算的函数是等价的。
前面漫长的证明哥德尔不完备定理过程中,哥德尔引入了“原始递归和递归函数”的概念,然后利用哥德尔编码把符号、好式子、证明,等一系列形式系统里的东西变成递归函数,再把递归函数变回形式系统里的符号,从而构造出“自指”的奇怪好式子。这里图灵用了同样的手法,让我们一步步看看图灵的戏法。
前面提到了递归函数的概念:(a) 初始函数、零函数和投射函数;(b) 替代操作;(c) 递归操作;(d) 受限μ−μ−操作。我们说,一个函数是递归的,当且仅当,它是(a)中的某一种函数,或者由递归函数通过(b)(c)(d)中任意一种操作而成。
在这里,我们放宽一下(d)操作,把受限μ−μ−操作变成非受限μ−μ−操作(unrestricted μ−μ−operation):
注意,对于某一组 ,若没有yy满足 ,则f(x1,...,xn)f(x1,...,xn)的函数值就没有定义,这也是为什么称为“部分函数”。
我们说,一个函数f(x1,...,xn)f(x1,...,xn)是部分递归函数(partial recursive function),当且仅当,它是初始函数,或者由部分递归函数经过替代、递归、非受限μ−μ−操作而构成。
我们将证明,部分递归函数与图灵机可计算函数等价。为此,我们先证明任一部分递归函数都可被图灵机计算。
标准图灵可计算(Standard Turing-Computable, ST-compute)
这里定义标准图灵可计算只是为了讨论方便,并没有引入新概念。
我们说,部分函数(partial function)f(x1,...,xn)f(x1,...,xn)是标准图灵可计算(standard Turing-computable),当存在一个图灵机FF,使得对于任意自然数k1,...,knk1,...,kn,以下条件成立:
令Bk1¯¯¯¯¯Bk2¯¯¯¯¯B...Bkn¯¯¯¯¯Bk1¯Bk2¯B...Bkn¯表示磁带上的一个“参数带(argument strip)”。注意,参数带右方没有格子,左方可能有其它格子。图灵机FF从参数带的k1¯¯¯¯¯k1¯的第一个格子开始操作:
1. FF停止,当且仅当,f(k1,...,kn)f(k1,...,kn)有定义;
2. 若FF停止,磁带上保留参数带,并且在右方打印Bf(x1,...,xn)¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯Bf(x1,...,xn)¯,也即把结果打印在参数带的右方。
3. 停机时,磁头对着f(x1,...,xn)¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯f(x1,...,xn)¯左起第一个格子;
4. 停机时,f(x1,...,xn)¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯f(x1,...,xn)¯