不可判定问题
从停机问题到 Rice 定理,看清图灵机的能力天花板
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
不可判定问题
从停机问题到 Rice 定理,看清图灵机的能力天花板
图灵机的形式化描述
上一页我们用停机问题展示了'不可判定'的含义。要严格证明存在不可判定问题,必须先有一个能包揽所有计算的模型——图灵机。
看到当前格子内容,按规则决定改写与移动方向
图灵机的计算过程
沿箭头读:圆角是配置(状态+读头位置),矩形是查表与改写
图灵机编码的思想
上一页我们看到图灵机按转移规则一步步改写纸带。但要证明停机问题不可判定,我们得让一台图灵机把另一台图灵机的描述当输入来读——这要求把图灵机本身变成字符串。
编译器读源程序就是「机器读机器描述」的现实版,语法解析本质就是解码
图灵机编码的具体方法
把图灵机的状态、符号、转移规则全部翻译成 0/1 串,让它成为一个可被读取的字符串。
图灵机与语言的关系
上页我们把图灵机编码成了字符串;现在反过来——图灵机读入字符串,会对它做出什么'回答'?正是这种'输入-回答'的视角,把图灵机和'语言'联系了起来。
合格清单=L;点头=接受;反复不放行=循环;必须明确答复=判定
递归语言与递归可枚举语言
按判定能力把语言分三层:递归 ⊂ 递归可枚举 ⊂ 所有语言;中间 r.e. 减去递归的部分正是不可判定语言所在。
康托尔对角线方法
前几页我们把图灵机打磨成了可编码的对象。但要证明「存在机器无法判定的问题」,还需要一把利器——康托尔在研究无限集合时发明的对角线方法。它告诉我们:无限之间也有大小之分。
旅馆挪房能容纳任意可数新客;但实数「旅馆」永远满员,证法就是改变对角线。
对角线方法图解
二维表格与对角线构造
对角线语言的构造
上页用对角线方法证明了实数不可数。现在要把同样思路搬到语言上:既然图灵机可枚举,能不能也翻转一下,造一个不在列表里的语言?
行为机器、列为串,每格记录是否接受;沿对角线取反就得到 Ld
对角线语言的性质
对角线语言 L_d 比停机问题更极端——它连递归可枚举都不是。
- 递归 = 存在图灵机对每个输入都停机
- 假设有图灵机 M_k 能判定 L_d
- 让 M_k 跑自己的编码 w_k,导出矛盾
- 结论:L_d 不可判定
- r.e. = 只对属于语言的串停机接受
- L_d 的补是 r.e.(通用 TM 可枚举)
- 若 L_d 也 r.e.,则 L_d 是递归的
- 结论:L_d 连半判定都做不到
通用图灵机
上一页用对角线方法抽象地证明了不可判定语言的存在。要把这个方法用到具体问题上,需要先有通用图灵机 U。
CPU 是固定硬件,靠读内存中的指令完成任何计算;U 是固定图灵机,靠读纸带上的 ⟨M⟩ 模拟任何 M
通用语言与编码
顺着箭头看:先分别编码,再配对成通用语言的一个实例
停机问题的定义
上节我们造出了通用图灵机,理论上能模拟任何图灵机——但有个朴素问题绕不过去:能不能再往前一步,造一个机器直接告诉你「任意程序会不会停下来」?这就是停机问题。
乐谱=程序,演奏=计算,要的是还没演奏就能预判有没有结尾
反证法框架
反证法的逻辑骨架:假设→构造→矛盾→否定假设。看推导链如何自我推翻。
停机问题不可判定的证明
用对角线法构造一台图灵机,让它在「是否停机」上自打嘴巴。
停机问题与对角线语言
我们已经分别知道 L_d 和 A_TM 都不可判定。这一页看它们之间的桥梁:归约。理解了这个,两条不可判定性结论就串成一条逻辑链。
把 (⟨M⟩,⟨M⟩) 送进万能仪,问的就是 L_d 想要的答案
其他不可判定问题
上一页证明了停机问题不可判定,但这并非孤例——借助「归约」这把钥匙,我们可以证明一大批问题同样不可判定。这一页看两个经典例子。
停机问题像源头,凡能被归约到它的问题,都跟着不可判定
时间复杂性
不可判定问题告诉我们有些问题算法根本无法解决。但对于那些可判定的问题呢?怎么衡量「算起来有多费劲」?这就需要时间复杂性。
楼层越高走的台阶越多;数台阶不看分钟
空间复杂性
上一页我们用「步数」衡量计算成本。但很多问题真正烧的不是时间,而是内存——SAT 求解器搜索指数棵树时,复用同一份草稿就够了。本页把度量换成带子上消耗的格子数。
草稿上写过多少格 ≈ 带单元数;时间复杂度像「算了几步」,空间像「用过几格纸」
复杂性层次
时间与空间复杂性的关系
P类问题
前面我们问'算不算得出来'——停机问题给出了边界。这一页切换视角:可判定的问题之间也有天壤之别。复杂性理论关心'花多少代价',而 P 类就是这条天梯的第一道门槛。
n 越大,多项式与指数级差距越夸张:多项式像 O(log n) 按目录翻书,暴力要翻 2^n 本
NP类问题
上一页我们讲了P类问题——多项式时间内能找到答案的问题。但现实里大量问题,找答案很难,验证答案却很容易。这就是NP类问题的核心特征。
找一个解可能极慢,但验证别人给的解是否符合规则是多项式时间
P与NP的关系
P 与 NP 都谈“多项式”,却分别描述求解与验证;是否相等仍未知。
- 核心条件:有多项式时间的判定算法
- 效率承诺:任何实例都能在多项式时间求解
- 集合关系:P中的问题也属于NP
- 核心条件:候选答案可被多项式时间验证
- 效率承诺:只保证易验证,不保证易求解
- 集合关系:是否还包含P外的问题仍未知
语言类的层次结构
从最小的正则语言逐层向上到递归可枚举语言,每一层都是严格的真包含关系。
图灵机能力边界的意义
我们已经看到停机问题不可判定,也了解了 P 类、NP 类和各种复杂性类。这些边界不是工程瓶颈,而是数学结构本身决定的——理解这一点,「无算法可解」才算真正落地。
都不是设备不行,而是数学/物理本身的结构性约束,再多投入也改变不了规则
自测检验
证明停机问题不可判定时,对角线论证最关键的一步是?
核心要点回顾
- ✓自指 + 对角化是制造不可判定性的通用技法
- ✓停机问题无解,不是因为难,而是因为不存在算法
- ✓语言有清晰层次:递归 ⊊ 递归可枚举 ⊊ 全体
- ✓P 与 NP 问的是效率边界,不是可计算边界
- ✓图灵机划出了计算的绝对边界
课后思考
先合上屏幕自己想,再翻看参考答案。三问分别落在回顾、应用、迁移三个层次。
参考答案L_d∈r.e. 由通用图灵机枚举给出;它不在任何 r.e. 集的补集中由对角线构造保证。而 r.e. 集对补运算不封闭——矛盾直接炸开。
参考答案把判定问题也编码为图灵机编号。假设存在判定器 M,让 M 跑在自身编码上,沿对角线套路即可。
参考答案不是一回事。前者划「能算 vs 不能算」——可行性的硬墙;后者划「快算 vs 慢算但能算」——效率梯度。两者层次不同。