不可判定问题

官方信息技术老师·29 页·深入(追求细节与边界)·0 次浏览·2 天前
图灵机停机问题Rice 定理计算极限

不可判定问题

从停机问题到 Rice 定理,看清图灵机的能力天花板

按 空格/→ 演示下一步

1 / 29 页

全部页面点击任意一页,跳回舞台从这页播放

图灵机停机问题Rice 定理计算极限

不可判定问题

从停机问题到 Rice 定理,看清图灵机的能力天花板

1第 1 页 · 不可判定问题

图灵机的形式化描述

上一页我们用停机问题展示了'不可判定'的含义。要严格证明存在不可判定问题,必须先有一个能包揽所有计算的模型——图灵机。

状态集Q
有限个内部状态,记录机器当前'在做什么'
转移函数δ
(当前状态,格上符号)→(新状态,写入符号,移动方向)
纸带与读写头
无限长纸带,头每次左/右移一格,负责读和改写
起始与接受状态
有唯一起始状态q₀,接受状态集F决定是否停机
仓库管理员按SOP处理单据对应 →图灵机按δ处理纸带符号

看到当前格子内容,按规则决定改写与移动方向

2第 2 页 · 图灵机的形式化描述

图灵机的计算过程

沿箭头读:圆角是配置(状态+读头位置),矩形是查表与改写

图解渲染中…
A2δ(q,a) 是转移函数,查表动作A4纸带改写符号并切换状态A8读写头移动改变下一配置A12进入停机态 qhalt
3第 3 页 · 图灵机的计算过程

图灵机编码的思想

上一页我们看到图灵机按转移规则一步步改写纸带。但要证明停机问题不可判定,我们得让一台图灵机把另一台图灵机的描述当输入来读——这要求把图灵机本身变成字符串。

图灵机是有限对象
状态集、字母表、转移规则都有限,因此整台机器可用有限信息描述
编码为字符串
给每个组件分配数字编号,按约定格式串接,得到⟨M⟩
解码无歧义
任何字符串至多对应一台图灵机,编码函数是单射
编码即输入
⟨M⟩只是普通字符串,可作为任意图灵机的输入带内容
源程序对应 →图灵机编码

编译器读源程序就是「机器读机器描述」的现实版,语法解析本质就是解码

M=wn11wn211wnk,wi=0i\langle M \rangle = w_{n_1}\,1\,w_{n_2}\,1\,\cdots\,1\,w_{n_k},\quad w_i = 0^i
4第 4 页 · 图灵机编码的思想

图灵机编码的具体方法

把图灵机的状态、符号、转移规则全部翻译成 0/1 串,让它成为一个可被读取的字符串。

1
编码状态集
每个状态 qi 映射为 i 个连续的 1(q1→1, q2→11),天然避免前缀歧义
2
编码带上符号
带上符号 Xj 同样用 j 个 1 表示,与状态共享一套编码语法
3
编码转移函数
每条规则 δ(qi,Xj)=(qk,Xl,Dm) 展开为五元组,各分量用 0 分隔
4
拼接为机器码
所有规则用 00 串接,得到图灵机唯一的二进制编号(哥德尔数)
5第 5 页 · 图灵机编码的具体方法

图灵机与语言的关系

上页我们把图灵机编码成了字符串;现在反过来——图灵机读入字符串,会对它做出什么'回答'?正是这种'输入-回答'的视角,把图灵机和'语言'联系了起来。

字母表与串
字母表Σ上的有限符号序列叫串,所有串的集合记为Σ*
语言 L
Σ*的任意子集叫语言L,本质是'被认可的串'的集合
识别 Recognize
M识别L:L中每个串都被M接受停机;非L的串M可以无限循环
判定 Decide
M判定L:对任何输入串M都停机,w∈L接受,w∉L拒绝
判定 ⊊ 识别
判定要求'永远停机',是比识别更强的性质;不可判定问题正源于此
质检员对应 →图灵机识别/判定语言

合格清单=L;点头=接受;反复不放行=循环;必须明确答复=判定

M 判定 L    L(M)=Lw,M(w) 停机\text{M 判定 L} \iff L(M) = L \land \forall w,\, M(w)\text{ 停机}
6第 6 页 · 图灵机与语言的关系

递归语言与递归可枚举语言

按判定能力把语言分三层:递归 ⊂ 递归可枚举 ⊂ 所有语言;中间 r.e. 减去递归的部分正是不可判定语言所在。

图解渲染中…
Br.e.:图灵机对'是'实例停机接受,对'否'可能永不停D递归/可判定:图灵机对任意输入都停机并给出 yes/noEr.e. 但非递归:能识别'是',但不存在算法可判定C非 r.e.:连'是'实例都没有图灵机可以识别
7第 7 页 · 递归语言与递归可枚举语言

康托尔对角线方法

前几页我们把图灵机打磨成了可编码的对象。但要证明「存在机器无法判定的问题」,还需要一把利器——康托尔在研究无限集合时发明的对角线方法。它告诉我们:无限之间也有大小之分。

双射定义大小
集合 A 与 B 等势当且仅当存在一一对应(双射)。这让「比较无限」有了严格意义。
可数无限为最小
自然数集 ℕ 是「最小」的无限:任何能与之双射的集合称为可数集。
实数集更大
|ℝ| 严格大于 |ℕ|。无论怎么排列,实数集总有「装不下」的数。
对角线构造
假设 ℝ 可数,列出 r₁, r₂…;构造新数 r 使第 i 位与 rᵢ 第 i 位不同,则 r 不在表中。
对角否证套路
把列表的第 i 项拿来反对第 i 步——这一结构将原样出现在停机问题证明中。
希尔伯特旅馆对应 →可数与不可数

旅馆挪房能容纳任意可数新客;但实数「旅馆」永远满员,证法就是改变对角线。

r=0.b1b2b3,bi={5,dii56,dii=5r = 0.b_1 b_2 b_3 \ldots,\quad b_i = \begin{cases} 5, & d_{ii} \neq 5 \\ 6, & d_{ii} = 5 \end{cases}
8第 8 页 · 康托尔对角线方法

对角线方法图解

二维表格与对角线构造

对角线方法图解
二维表格与对角线构造
9第 9 页 · 对角线方法图解

对角线语言的构造

上页用对角线方法证明了实数不可数。现在要把同样思路搬到语言上:既然图灵机可枚举,能不能也翻转一下,造一个不在列表里的语言?

枚举所有图灵机
把所有图灵机排成序列 M₁, M₂, ..., 每个对应一个 r.e. 语言 L(Mᵢ)
挑代表串 wᵢ
选定串的枚举 w₁, w₂, ..., 让 wᵢ 作为检验第 i 台机器的代表
沿对角线翻转
定义 Ld = { wᵢ | wᵢ ∉ L(Mᵢ) },第 i 行 wᵢ 位置与原表相反
必不在列表中
对每个 i,wᵢ 在 Ld 和 L(Mᵢ) 中的归属相反,所以 Ld ≠ L(Mᵢ)
康托尔的对角线表对应 →对角线语言

行为机器、列为串,每格记录是否接受;沿对角线取反就得到 Ld

wiLd    wiL(Mi)w_i \in L_d \iff w_i \notin L(M_i)
10第 10 页 · 对角线语言的构造

对角线语言的性质

对角线语言 L_d 比停机问题更极端——它连递归可枚举都不是。

L_d 不是递归语言
  • 递归 = 存在图灵机对每个输入都停机
  • 假设有图灵机 M_k 能判定 L_d
  • 让 M_k 跑自己的编码 w_k,导出矛盾
  • 结论:L_d 不可判定
L_d 不是递归可枚举语言
  • r.e. = 只对属于语言的串停机接受
  • L_d 的补是 r.e.(通用 TM 可枚举)
  • 若 L_d 也 r.e.,则 L_d 是递归的
  • 结论:L_d 连半判定都做不到
L_d 是非 r.e. 语言的标本——比停机问题(r.e. 但不递归)还要难一层。
11第 11 页 · 对角线语言的性质

通用图灵机

上一页用对角线方法抽象地证明了不可判定语言的存在。要把这个方法用到具体问题上,需要先有通用图灵机 U。

U 的输入
纸带初始写着 ⟨M⟩ 接 w:先是一台图灵机 M 的编码,再串上 M 要处理的输入 w
U 的工作方式
在自己的纸带上维护 M 的当前状态、纸带内容、读写头位置,逐条查 δ 模拟 M 的每一步转移
忠实模拟
M 接受 w 当且仅当 U 接受 ⟨M⟩w;M 永不停机时 U 也不停机——U 完全复刻 M 的行为
U 也有编码
U 本身也是一台图灵机,所以它也有一份编码 ⟨U⟩——这为下一页让 M 取 M = U 制造自指埋下伏笔
通用 CPU + 任意程序对应 →通用图灵机 U + 任意 ⟨M⟩

CPU 是固定硬件,靠读内存中的指令完成任何计算;U 是固定图灵机,靠读纸带上的 ⟨M⟩ 模拟任何 M

12第 12 页 · 通用图灵机

通用语言与编码

顺着箭头看:先分别编码,再配对成通用语言的一个实例

图解渲染中…
a2把TM的7元组逐项编码成0/1串a5用编码中不会出现的分隔符拼接a6U读入此串并模拟M在w上运行
13第 13 页 · 通用语言与编码

停机问题的定义

上节我们造出了通用图灵机,理论上能模拟任何图灵机——但有个朴素问题绕不过去:能不能再往前一步,造一个机器直接告诉你「任意程序会不会停下来」?这就是停机问题。

停机问题
判定任意程序在给定输入上是否最终停机
输入是二元组
形如(程序描述, 输入串)的配对
输出是二值的
要么停、要么不停,泾渭分明
判定问题
答案非黑即白,正是图灵机擅长处理的
看似简单
只是「程序跑不跑得完」,却被证明不可能
指挥看未演奏的乐谱对应 →停机判定器

乐谱=程序,演奏=计算,要的是还没演奏就能预判有没有结尾

H={M,w图灵机 M 在输入 w 上停机}H = \{\langle M, w\rangle \mid \text{图灵机 } M \text{ 在输入 } w \text{ 上停机}\}
14第 14 页 · 停机问题的定义

反证法框架

反证法的逻辑骨架:假设→构造→矛盾→否定假设。看推导链如何自我推翻。

图解渲染中…
a3对角线机D借用H做子例程,照康托尔式套路a8D停⟺D不停,罗素悖论式的自指矛盾
15第 15 页 · 反证法框架

停机问题不可判定的证明

用对角线法构造一台图灵机,让它在「是否停机」上自打嘴巴。

1
假设 H 存在
假设有图灵机 H 能对任意 ⟨M,w⟩ 判定 M 在 w 上是否停机
2
构造对角线机 D
D 读到自身编码 ⟨D⟩ 后,调 H(⟨D⟩,⟨D⟩) 并故意反转其结论
3
让 D 读自身
让 D 真去跑自己的编码,问 D(⟨D⟩) 到底是停还是不停
4
两种情况都矛盾
若 D 停机 → D 应死循环;若 D 不停 → D 应立即停:都崩
5
推翻假设
H 不可能存在,停机问题不可判定
16第 16 页 · 停机问题不可判定的证明

停机问题与对角线语言

我们已经分别知道 L_d 和 A_TM 都不可判定。这一页看它们之间的桥梁:归约。理解了这个,两条不可判定性结论就串成一条逻辑链。

归约方向
L_d 归约到 A_TM:A_TM 是更难的问题,能解它就能解 L_d
构造核心
给定 ⟨M⟩,调用 A_TM 判定器于 (⟨M⟩,⟨M⟩),问 M 是否接受自身编码
矛盾闭环
L_d 不可判定 ⟹ A_TM 不可判定,反证链条完整
整体意义
两个定理本质是同一论证:先证 L_d 不可判定,再归约推出 A_TM
万能体检仪判'是否患病'对应 →A_TM 判定'是否接受 w'

把 (⟨M⟩,⟨M⟩) 送进万能仪,问的就是 L_d 想要的答案

$D(\langle M \rangle) = \overline{H(\langle M \rangle, \langle M \rangle)}$
17第 17 页 · 停机问题与对角线语言

其他不可判定问题

上一页证明了停机问题不可判定,但这并非孤例——借助「归约」这把钥匙,我们可以证明一大批问题同样不可判定。这一页看两个经典例子。

归约思想
若能从停机问题构造到问题 A 的转换,使 A 有解等价于对应图灵机停机,则 A 不可判定
波斯特对应问题
给若干「上串/下串」瓷砖对,问能否找到有限序列,使上下拼接串完全相同
希尔伯特第十问题
给定整系数多项式方程,问是否有整数解;1970 年马蒂雅谢维奇证明不可判定
传染病零号病人对应 →归约传播

停机问题像源头,凡能被归约到它的问题,都跟着不可判定

x1,,xnZ,  P(x1,,xn)=0\exists\, x_1,\dots,x_n \in \mathbb{Z},\; P(x_1,\dots,x_n)=0
18第 18 页 · 其他不可判定问题

时间复杂性

不可判定问题告诉我们有些问题算法根本无法解决。但对于那些可判定的问题呢?怎么衡量「算起来有多费劲」?这就需要时间复杂性。

单步操作
图灵机一次状态转移算一步:读、改写、移动、进入新状态
时间函数 T(n)
输入串长度|w|=n时,从启动到停机的状态转移总次数
最坏情形
取所有长度为n的输入中步数的最大值作为时间度量
渐近阶 O(f(n))
忽略常数和低阶项,只刻画随n增长的主导趋势
时间是核心资源
与空间复杂度并列,但时间通常是更紧的约束
爬楼梯的级数对应 →图灵机的步数

楼层越高走的台阶越多;数台阶不看分钟

TM(n)=maxw=ntransitions(M,w)T_M(n)=\max_{|w|=n}\text{transitions}(M,w)
19第 19 页 · 时间复杂性

空间复杂性

上一页我们用「步数」衡量计算成本。但很多问题真正烧的不是时间,而是内存——SAT 求解器搜索指数棵树时,复用同一份草稿就够了。本页把度量换成带子上消耗的格子数。

空间复杂度定义
图灵机对长度为 n 的输入,计算过程中同时占用带单元数的最大值,不计输入带
空间复杂性类
确定版 SPACE(s(n)) 与非确定版 NSPACE(s(n)),代表:L、NL、PSPACE
Savitch 定理
非确定空间被确定空间平方模拟:NSPACE(s(n)) ⊆ SPACE(s²(n)),推出 PSPACE=NPSPACE
PSPACE 的力量
PSPACE ⊇ NP:多项式时间可验证的多项式空间必能枚举,严格包含关系仍开放
PSPACE 完全问题
TQBF(量化布尔公式):∀∃∀… 交替量化的 SAT,是 PSPACE 的标杆
做数学题的草稿纸对应 →空间复杂度

草稿上写过多少格 ≈ 带单元数;时间复杂度像「算了几步」,空间像「用过几格纸」

NSPACE(s(n))SPACE(s2(n))\text{NSPACE}(s(n)) \subseteq \text{SPACE}(s^2(n))
20第 20 页 · 空间复杂性

复杂性层次

时间与空间复杂性的关系

复杂性层次
时间与空间复杂性的关系
21第 21 页 · 复杂性层次

P类问题

前面我们问'算不算得出来'——停机问题给出了边界。这一页切换视角:可判定的问题之间也有天壤之别。复杂性理论关心'花多少代价',而 P 类就是这条天梯的第一道门槛。

P 类的定义
存在确定性图灵机,时间复杂度为 O(n^k)(k 为常数)的问题集合
多项式时间的含义
步数随输入规模 n 以多项式增长;远慢于 2^n 等指数函数
P 与可判定的关系
P ⊆ 可判定;多数人相信可判定 ⊋ P(存在不在 P 中的判定问题)
P 中的典型问题
排序、单源最短路径、2-SAT、图可达性、素性判定(AKS 2002)
入 P 的意义
告别指数级暴力枚举;证明存在高效算法,标志着技巧上的突破
图书馆按索书号找书对应 →P 类问题的多项式算法

n 越大,多项式与指数级差距越夸张:多项式像 O(log n) 按目录翻书,暴力要翻 2^n 本

T(n)=O(nk),kNT(n) = O(n^k),\quad k \in \mathbb{N}
22第 22 页 · P类问题

NP类问题

上一页我们讲了P类问题——多项式时间内能找到答案的问题。但现实里大量问题,找答案很难,验证答案却很容易。这就是NP类问题的核心特征。

NP的双重定义
非确定性图灵机多项式时间可解,等价于存在多项式时间验证者
验证易,求解难
给一个候选解验证其正确与否,远比从零开始搜索容易得多
P ⊆ NP
能多项式求解必能多项式验证,P是NP的子集
P vs NP问题
P是否等于NP?克雷数学研究所千禧年七大问题之一,至今未解
经典NP问题
SAT、子集和、哈密顿回路、旅行商判定版都属于NP
数独游戏对应 →NP问题

找一个解可能极慢,但验证别人给的解是否符合规则是多项式时间

xLy, ypoly(x), V(x,y)=acceptx \in L \Leftrightarrow \exists y,\ |y| \leq \text{poly}(|x|),\ V(x, y) = \text{accept}
23第 23 页 · NP类问题

P与NP的关系

P 与 NP 都谈“多项式”,却分别描述求解与验证;是否相等仍未知。

P类
  • 核心条件:有多项式时间的判定算法
  • 效率承诺:任何实例都能在多项式时间求解
  • 集合关系:P中的问题也属于NP
NP类
  • 核心条件:候选答案可被多项式时间验证
  • 效率承诺:只保证易验证,不保证易求解
  • 集合关系:是否还包含P外的问题仍未知
已知 P⊆NP;真正的未解问题是 P 是否等于 NP。
24第 24 页 · P与NP的关系

语言类的层次结构

从最小的正则语言逐层向上到递归可枚举语言,每一层都是严格的真包含关系。

图解渲染中…
REG有限自动机(DFA/NFA)可识别CS线性有界自动机识别R存在总停机的判定器(即可判定语言)RE图灵机可识别;停机语言 H 就在此层
25第 25 页 · 语言类的层次结构

图灵机能力边界的意义

我们已经看到停机问题不可判定,也了解了 P 类、NP 类和各种复杂性类。这些边界不是工程瓶颈,而是数学结构本身决定的——理解这一点,「无算法可解」才算真正落地。

边界是数学必然
图灵机能力有限是可证明的数学定理,不是工程瓶颈,硬件再升级也突破不了
根源一:基数差异
所有图灵机可枚举为可数集,但 Σ* 上语言总数是不可数集,差距决定绝大多数语言无对应算法
根源二:自指与对角线
程序能读自身编码,对角线论证由此导出停机问题等具体不可判定实例
边界有内部层次
递归 ⊊ 递归可枚举 ⊊ 全体语言,每一层都是真实的能力跃迁,不是同一档内分高低
物理中的光速极限对应 →图灵机能力边界

都不是设备不行,而是数学/物理本身的结构性约束,再多投入也改变不了规则

Σ=020=2Σ|\Sigma^*| = \aleph_0 \ll 2^{\aleph_0} = |2^{\Sigma^*}|
26第 26 页 · 图灵机能力边界的意义

自测检验

点击作答

证明停机问题不可判定时,对角线论证最关键的一步是?

27第 27 页 · 自测检验

核心要点回顾

  • 自指 + 对角化是制造不可判定性的通用技法
  • 停机问题无解,不是因为难,而是因为不存在算法
  • 语言有清晰层次:递归 ⊊ 递归可枚举 ⊊ 全体
  • P 与 NP 问的是效率边界,不是可计算边界
  • 图灵机划出了计算的绝对边界
延伸主题:递归论与算术层级可计算性的等价模型P≠NP 研究前沿
28第 28 页 · 核心要点回顾

课后思考

先合上屏幕自己想,再翻看参考答案。三问分别落在回顾、应用、迁移三个层次。

1对角线语言 L_d 既属于 r.e.,又不与任何 r.e. 语言互补——这一双重身份如何直接引爆矛盾?

参考答案L_d∈r.e. 由通用图灵机枚举给出;它不在任何 r.e. 集的补集中由对角线构造保证。而 r.e. 集对补运算不封闭——矛盾直接炸开。

2让你证「程序是否输出特定字符串」也不可判定,能用今天的方法自己搭一遍证明吗?第一步做什么?

参考答案把判定问题也编码为图灵机编号。假设存在判定器 M,让 M 跑在自身编码上,沿对角线套路即可。

3图灵机划了「能不能算」的边界,P vs NP 划的是「快慢」的边界。这两类边界是同一回事吗?

参考答案不是一回事。前者划「能算 vs 不能算」——可行性的硬墙;后者划「快算 vs 慢算但能算」——效率梯度。两者层次不同。

29第 29 页 · 课后思考
不可判定问题 · 知识图解