MathLabs
定理已证明

停机问题的不可判定性

命题陈述

不存在这样的算法 H(e,x)H(e,x):对每个程序索引 ee 和输入 xx,它总是停机并正确输出 φe(x)\varphi_e(x)(即以输入 xx 运行程序 ee)是否会停机。

为什么成立?

这正是无论何种杀毒软件、编译器或集成开发环境,都无法在完全一般的意义下完美检测出死循环、死代码或"这个函数总是崩溃"的数学原因——这不是当今工程技术的局限,而是一堵坚硬的数学壁垒。

证明思路

反证:假设存在这样的判定器 HH:若 φe(x) ⁣↓\varphi_e(x)\!\downarrow(停机)则 H(e,x)=1H(e,x)=1,若 φe(x) ⁣↑\varphi_e(x)\!\uparrow(永远运行)则 H(e,x)=0H(e,x)=0,且 HH 本身总是停机并给出正确答案。

利用 HH,构造一个新程序 DD,对输入 ee:计算 H(e,e)H(e,e);若 H(e,e)=1H(e,e)=1,则 DD 进入无限循环;若 H(e,e)=0H(e,e)=0,则 DD 立即停机。DD 是由 HH 有效构造而成的(只是 HH 加上一条 if 语句和一个循环),所以它有某个程序索引 dd,即 D=φdD=\varphi_d。

现在提出自指的问题:φd(d)\varphi_d(d) 是否停机?

情形1:若 φd(d)\varphi_d(d) 停机,那么由 HH 的正确性,H(d,d)=1H(d,d)=1。但由 DD 的定义,H(d,d)=1H(d,d)=1 会使 DD 在输入 dd 上永远循环——即 φd(d)\varphi_d(d) 不停机。矛盾。

情形2:若 φd(d)\varphi_d(d) 不停机,那么由 HH 的正确性,H(d,d)=0H(d,d)=0。但由 DD 的定义,H(d,d)=0H(d,d)=0 会使 DD 在输入 dd 上停机——即 φd(d)\varphi_d(d) 确实停机。矛盾。

两种情形都导致矛盾,所以 HH 存在的假设为假。停机问题不可判定。■\blacksquare

用到此定理的主题

分步证明

该定理暂无分步证明。

参考文献

  1. Wikipedia contributors (2024). Halting problem
  2. Wikipedia contributors (2024). Rice's theorem
  3. Wikipedia contributors (2024). Ackermann function