Kleene 递归定理
Kleene 递归定理是可计算性理论中的一个核心结果,它揭示了递归函数(或图灵机)具有自我引用的能力。该定理在程序理论、逻辑和计算机科学中有广泛应用,例如用于证明不可判定性、构造自复制程序以及理解递归程序的行为。
1. 预备知识:可计算函数与编号
为了理解递归定理,我们首先需要明确“可计算函数”的形式化概念。一个函数 \(f: \mathbb{N} \to \mathbb{N}\) 是可计算的,如果存在一个图灵机(或等价的计算模型),当输入自然数 \(x\) 时,它能在有限步内输出 \(f(x)\)。
由于图灵机(或程序)可以被有限地描述,我们可以为所有图灵机分配唯一的自然数编号。设 \(\phi_e\) 表示编号为 \(e\) 的图灵机计算的偏函数(即可能在某些输入上无定义)。这种编号称为可接受编号(admissible numbering),它满足以下性质:
- 通用函数定理:存在一个可计算函数 \(u(e, x)\) 使得 \(u(e, x) = \phi_e(x)\)。这意味着有一个“通用图灵机”可以模拟任何其他图灵机的行为。
- s-m-n 定理:对于任意部分可计算函数 \(f(e, x_1, \dots, x_m, y_1, \dots, y_n)\),存在一个可计算函数 \(s\) 使得 \(\phi_{s(e, x_1, \dots, x_m)}(y_1, \dots, y_n) = f(e, x_1, \dots, x_m, y_1, \dots, y_n)\)。直观上,s-m-n 定理允许我们将部分参数“固定”到一个程序中,生成一个新程序。
2. 递归定理的表述
Kleene 递归定理有两种主要形式:
第一递归定理(固定点定理):对于任意可计算函数 \(f: \mathbb{N} \to \mathbb{N}\),存在一个自然数 \(n\) 使得:
\[\phi_{f(n)} = \phi_n \]
这里的 \(n\) 称为函数 \(f\) 的一个固定点。直观上,无论你如何变换程序(通过 \(f\)),总存在一个程序 \(n\) 使得变换后的程序 \(f(n)\) 与原始程序 \(n\) 计算相同的函数。
第二递归定理(带参数):对于任意部分可计算函数 \(\psi(e, x)\),存在一个可计算函数 \(r\) 使得对于所有 \(x\):
\[\phi_{r(x)}(y) = \psi(r(x), y) \]
这允许程序在计算过程中访问自身的描述(编号)。
3. 递归定理的证明思路
我们以第一递归定理为例,展示其证明如何依赖 s-m-n 定理和通用函数:
- 定义辅助函数:考虑函数 \(g(e, x) = \phi_{\phi_e(e)}(x)\)(如果 \(\phi_e(e)\) 有定义,否则无定义)。由于 \(u\) 可计算,\(g\) 是部分可计算的。
- 应用 s-m-n 定理:存在可计算函数 \(s\) 使得 \(\phi_{s(e)}(x) = g(e, x) = \phi_{\phi_e(e)}(x)\)。即 \(s(e)\) 是一个程序,其行为是:先计算编号为 \(e\) 的程序在输入 \(e\) 上的输出 \(k\),然后模拟编号为 \(k\) 的程序。
- 构造固定点:给定任意可计算函数 \(f\),考虑复合函数 \(f \circ s\)。由于 \(f\) 和 \(s\) 可计算,\(f \circ s\) 也可计算,设其编号为 \(e_0\)(即 \(\phi_{e_0} = f \circ s\))。
- 验证固定点:令 \(n = s(e_0)\)。则有:
\[ \phi_n(x) = \phi_{s(e_0)}(x) = \phi_{\phi_{e_0}(e_0)}(x) = \phi_{f(s(e_0))}(x) = \phi_{f(n)}(x) \]
因此 \(\phi_n = \phi_{f(n)}\),即 \(n\) 是 \(f\) 的固定点。
4. 递归定理的应用与意义
- 自复制程序:递归定理可用于构造一个程序,其输出恰好是自身的源代码(即“自复制程序”或“奎因”)。
- 不可判定性证明:例如,利用递归定理可以简洁证明停机问题的不可判定性:假设存在停机判定函数,通过构造自指涉的程序导致矛盾。
- 递归程序的理论基础:递归定理保证了递归定义的程序的存在性,为程序设计语言中递归函数的合理性提供了理论依据。
通过以上步骤,我们看到了 Kleene 递归定理如何从可计算函数的基本定义出发,通过精巧的构造揭示程序自我引用的深刻性质,并在计算理论中发挥重要作用。