本节摘要:可计算性理论最震撼的结论——存在不可判定的问题,任何算法都解决不了。本节讲清楚停机问题不可判定的对角线证明、归约方法怎么证明其他问题不可判定、以及不可判定性为什么普遍存在。读完你能理解为什么"计算有边界"不是悲观,是事实。
停机问题:给定程序 M 和输入 w,M 在 w 上运行是否会停机(不停机即死循环)?
这是可计算性理论的标志性问题。图灵 1936 年证明它不可判定——不存在判定器能对所有 (M, w) 给出"停机"或"不停机"的答案。
为什么这个问题重要?因为很多程序分析问题归约到它——判断程序是否死循环、是否满足规范、是否有漏洞,本质都是停机问题的变体。停机问题不可判定,意味着这些程序分析问题也多数不可判定,没法完全自动化。
证明用对角线论证(哥德尔方法的变体):
假设存在判定器 H(M, w),能判定 M 在 w 上是否停机。构造新程序 D(M):
D(M): if H(M, ⟨M⟩) == "停机": 死循环(不停机) else: 停机
D 把 M 当输入,问 H"M 在 M 自己的描述上停机吗"。如果 H 说停机,D 就死循环;如果 H 说不停机,D 就停机。
现在问:D 在 D 自己的描述上停机吗?即 D(D)?
无论哪种情况都矛盾,所以假设的 H 不存在——停机问题不可判定。

这个证明的精髓是自指悖论:构造一个程序 D,它对自己运行,按 H 的回答做相反的事,产生矛盾。这和理发师悖论("给所有不给自己刮胡子的人刮胡子的理发师,给自己刮吗")同构——自指导致矛盾,证明假设不成立。
证明停机问题不可判定后,怎么证明其他问题不可判定?用归约(Reduction)。
归约的直觉:把问题 A 转化成问题 B。如果能用 B 的解法解 A,且 A 不可判定,那么 B 也不可判定(否则 B 的解法就能解 A,矛盾)。
具体:要证明 B 不可判定,把停机问题归约到 B——构造一个转换,把任意 (M, w) 转成 B 的实例 b,使得 b ∈ B iff M 在 w 上停机。如果 B 可判定,就能判定停机问题,矛盾。所以 B 不可判定。
举例:证明"判断程序是否输出 0"不可判定。给定 (M, w),构造程序 M':模拟 M 在 w 上运行,如果 M 停机则输出 0,否则不停。M' 输出 0 iff M 在 w 上停机。所以"判断输出 0"能判定就能判定停机,矛盾。
不可判定问题不止停机问题,实际上不可判定是普遍的——多数"有趣"的程序性质都不可判定。
Rice 定理:任何程序行为的非平凡性质都不可判定。即判断程序是否计算某函数、是否在某输入输出某值等,都不可判定。
这个定理震撼——它说程序分析的几乎所有问题都不可判定。判断程序是否排序、是否找最大值、是否死循环,统统不可判定。这就是为什么没法写一个通用的程序分析工具——不是技术不够,是理论上不可能。
其他不可判定问题:
这些来自不同领域的问题都不可判定,说明不可判定性是计算的内在局限,不是某个问题的偶然特性。
不可判定问题之间也有层级——有些"更不可判定"。
算术层级:按量词交替把不可判定问题分类。停机问题在 Σ₁(存在一个计算路径停机)。它的补在 Π₁(所有路径不停机)。更高层级有 Σ₂、Π₂ 等,涉及更多量词交替,"更难判定"。
图灵度:按归约关系把不可判定问题排序。停机问题是"图灵完备"的(最难的可识别问题)。有些问题比停机问题更难(如判定某程序是否对所有输入停机,是 Π₂,比停机问题高一层)。
这个层级说明不可判定不是二元的(可判定/不可判定),而是有复杂结构。但实践中多数不可判定问题都和停机问题等价,层级区分主要理论意义。
既然不可判定,实际怎么处理?
1. 限制问题:不解决一般情况,解决受限的子集。如类型检查限制类型级计算必须终止(如 Coq 的全局可终止性检查),程序分析限制循环深度。
2. 近似:不精确但有用。如静态分析工具(Coverity)找可能的漏洞,不保证找全,但找多数。模型检测限制状态空间大小。
3. 启发式:经验法则,多数情况有效。如编译器优化、SAT 求解器用启发式加速。
4. 半自动:机器辅助,人工补充。如定理证明器(Coq、Isabelle)自动处理简单部分,人工处理关键步骤。
5. 概率方法:随机算法以高概率给正确答案。如概率类型检查、随机测试。
没有银弹——不可判定问题注定没法完全自动解决,只能用这些妥协方法。
不可判定性不只是技术结论,有哲学意义:
当然这些是哲学解读,不是严格结论。但不可判定性确实改变了我们对"计算"和"思维"的根本看法。
⚠️ 常见误读:以为"不可判定意味着没法写程序"。错。不可判定是说没有程序能对所有输入给答案,但可以为多数输入写程序——只是总有某些输入会让程序卡住或给错答案。实践用近似/限制/启发式应对。
💡 关键直觉:停机问题不可判定由对角线证明(构造自指悖论 D 对自己运行)。归约方法把停机问题转化到其他问题证明其不可判定。Rice 定理说程序非平凡性质都不可判定,程序分析几乎全不可判定。实际用限制/近似/启发式/半自动/概率应对。不可判定是计算内在局限,有哲学意义。