Lecture 7. Reducibility 可归约性
简单地说,归约(reduction)就是把一个问题转化成另一个问题,且可以用第二个问题的解来解第一个问题。
如果有 A 和 B 两个语言(或问题),如果可以用 B 来解决 A,就说 A 可归约到 B。
- 如果 B 容易解决,那么 A 也会容易解决。因为 A 可以转化到 B 去。
- 但如果 A 比较难,B 也会难。 因为如果 B 不难,A 也不会难的。我们着重应用第二条。
例如:
- 求矩形的面积,可以归约到求长宽
- 可归约到
- 可归约到
当然,有可能会存在 A 和 B,使 A 能归约到 B,同时 B 也能归约到 A,即 AB 等价。
语言理论中的不可判定问题
比如,对于语言 是否可判定,可以归约到另一个语言 是否可判定。这是停机问题(halting problem)。
定理: 不可判定。证明思路是采用反证法(事实上,大部分的不可判定,都可以用归约到 的方法证明)。
假设 可判定,就能证明 可判定(设 是 的判定器,构造图灵机 判定 ):
“在输入 上,
- 先跑一遍判定器 看看 是否对于输入 停机。如果不能停机,直接拒绝。
- 由于现在确保 可以停机,于是就直接模拟运行 ,直到停机为止。若 接受则 接受, 拒绝则 拒绝”
但是这与事实不符,因为 明明是不可判定的,这里证明出它可判定,产生了矛盾,所以最初的假设不成立。于是 不可判定。
定理: 不可判定。 像刚才一样,用反证法(归约)。
先假设 可判定,就能证明 可判定(设 是 的判定器,构造图灵机 判定 )。
“在输入 上
- 第一步,把图灵机 转化成一个新的图灵机 ,其中 ‘在输入 上:
- 如果 则直接拒绝,否则在 上面运行 。
- 若 接受, 接受,否则拒绝。’
- 可以看到, 和 非常像,唯一的差别就是提前检查了一下是否 。所以,。
- 第二步,用 检查 是否是空的,即是否满足 ,也就是在输入 上运行 看是否接受。如果是,意味着 拒绝 ,则拒绝。否则意味着 接受 ,则接受。”
但是这与事实不符,因为 明明是不可判定的,所以 不可能知道 能否接受 。这里证明出它可判定,产生了矛盾,所以最初的假设不成立。于是 不可判定。
映射可归约性 Mapping Reducibility
也有的教材,写作 多一可归约性(many-one reducibility)。
图灵机计算函数的方法是,把函数的输入放在纸带上,开始运行,最终停机,把停机后纸带上的内容作为函数的输出。
定义:如果有一个图灵机 ,使得在在每个输入 上都停机,且此时只有 出现在纸带上,则称函数 是一个 可计算函数(computable function)。
定义:如果存在一个可计算函数 使得对于每个 ,,记作 ,则称函数 是 到 的 归约,语言 是 映射可归约(mapping reducible) 到语言 的。注意,定义当中的符号 的含义是 当且仅当。也就是,如果有 ,则也必须满足 。
也就是说,如果要证明映射可归约性,只需要把这个可计算的归约函数 写出来就好了。 的定义域永远是 ,到达域永远是 。注意要满足当且仅当的特性才能是可计算函数。
下图可以形象化的表达可计算函数的定义:

举一个映射规约的例子:,对应的可计算的规约函数 是:。因为 ,即: 接受 当且仅当 。课件上写成了 ,应该是课件错了吧,反正书上是没有那左右 angle 符号的。
根据定义,如果 ,那么 同时成立。 不过, 不一定成立,要不然干嘛要用小于号而不是等于号来表示映射可归约呢?
不仅如此, 是一个可传递的二元关系。也就是说,如果 且 同时成立,就能够得到 .
关于可判定性
定理:若 且 是可判定的,则 也是可判定的。证明:设图灵机 判定 ,构造 的判定器 :“在输入 上,首先计算 ,然后用 的值作为 的输入,检查是否满足 ,最终 接受就接受,否则拒绝。”
推论:若 且 是不可判定的,则 也是不可判定的。
定理:若 且 是图灵可识别的,则 也是图灵可识别的。证明方法与刚才类似。
推论:若 且 不是图灵可识别的,则 也不是图灵可识别的。这一条推论对于证明图灵不可识别尤其重要。
注意:上述关于图灵可识别性的定理和推论,只适用于映射归约,而对于普通的归约,是不满足的。举个例子: 可归约到它的补 。后者是图灵可识别的,但是前者不是。
映射可归约性和普通可归约性对比
- 映射可归约性:把 A 问题转化成 B 问题。是一种特殊的可归约性问题,对于证明图灵不可识别非常好用。
- 普通可归约性:用 B 问题来解决 A 问题。在概念上更加简单,对于证明不可判定非常好用。
注意:
- 可归约到
- 但是 可能并不能映射归约到 ,比如 (图灵可识别语言在补运算下不封闭)
证明不可判定、图灵不可识别的技巧
如果要证明 不可判定,一般做法是找到一个已知的可归约到 的不可判定语言 (通常选择 ),然后假设 可判定,令 是 的判定器,然后构造出一个图灵机 判定 。然而 是不可判定的,产生矛盾,假设不成立,于是 不可判定。
如果要证明 图灵不可识别,一般做法是,找到一个已知的映射可归约到 的图灵不可识别的语言 (通常选择 ),然后写出规约函数 。(上面第二条推论)
例:证明 不可判定
廖智炫教我的。核心思路是:
假设 是 的判定器。用 构造一个图灵机 。
先搞一个 出来, 接受 的时候, 接受正则语言 ; 拒绝 的时候 只接受一个非正则语言 。换句话说, 接受所有具有 形式的串串,且在 接受 的时候接受任意串()。
然后 把 作为输入调用 。如果 接受 就接受, 拒绝 就拒绝。
于是这个 具有了判定 的作用。
例:证明 是图灵不可识别的
上面已经指出过:。所以把不等号两边分别取反,仍然成立:。对应的规约函数仍然是:。因为 ,即: 拒绝 当且仅当 。
于是, 既不可判定(之前证明过),也不可识别(现在刚证明)。
例:证明 既不是图灵可识别的,也不是补图灵可识别的
即: 和 都不是图灵可识别的。
要证明这个论题,只需分别证明:
- ,即证明不是图灵可识别的
- ,即证明不是补图灵可识别的
最后再应用上面第二条推论:若 且 不是图灵可识别的,则 也不是图灵可识别的。就能证明完了。
回忆一下: 及其补的格式是 , 及其补的格式是 。
证明方法是,对于任意的字符串 ,都构建对应的图灵机 ,
“对于输入 ,
- 忽略
- 在 上面执行 ”
也就是说,不管 遇到什么样的输入,都不管他,直接用 执行 。
另外,再构建一个图灵机 ,不管遇到啥输入都是直接拒绝。还有一个 ,不管遇到啥输入都直接接受。
那么:
- 对于前者 ,可以构建出归约函数 ,因为 不接受 (形式化表述为 ),当且仅当 总是拒绝 (形式化表述为 ,即 )。
- 对于后者 ,可以构建出归约函数 ,因为 不接受 (形式化表述为 ),当且仅当 总是不接受 (形式化表述为 ,即 )。
虽然很是拗口,但要努力理解一下
两个归约函数都写出来了,于是这个论题也证明完了。
计算历史方法 Computation History Method
希尔伯特第十题
语言 。该语言不可判定。
证明思路 1:证明 可归约到 。由于 不可判定,所以 也不可判定。
但是很难证明这个可归约性。这里需要使用 计算历史方法(computation history method)。
波斯特对应问题 Post Correspondence Problem
以骨牌簇的形式给出若干对字符串:。
定义 匹配 是指一个有限的序列(可重复),使得 。
如:,于是可重复排列 就是 的一个匹配(使 )。通俗的说,就是把骨牌簇可重复地重新排列,如果上半部分和下半部分相等,这个排列就称之为匹配。
波斯特对应问题,指的就是:给定骨牌簇 ,问 是否拥有匹配?
令语言 。该语言是不可判定的。要证明这个东西,也需要 计算历史方法。
回顾:图灵机的格局
图灵机的格局是一个三元组 , 表示状态, 表示读写头的位置, 表示纸带的内容。
一个格局可以被编码用字符串表示为 ,其中 ,且读写头的位置在 的第一个符号上。如:格局 可以编码为 。
格局可以代表图灵机在一个时刻的快照,就像电子游戏里面的存档一样。
计算历史
定义:图灵机 在输入 上的一个 接受计算历史(accepting computation history) 是指一个格局序列 ,其中 是起始格局。类似地,可以定义 拒绝计算历史(rejecting computation history)。注意,计算历史是一段格局的 序列,而不是一个单独的格局。
计算历史可以被编码为 的形式(当然,每一个 也被编码了)。比如下面这一坨就是一个接受计算历史。
线性界限自动机 Linearly Bounded Automata
是一种特殊的受到限制的图灵机,读写头不能移动到输入串以外的区域,也就是纸带的长度等于输入串的长度。
定义语言 。虽然 LBA 也是一种图灵机,但是 其实 是可判定的!因为,假如输入串的长度是 ,那么 LBA 的格局数最多就是 。因此,如果一台 LBA 运行足够久还不停机,仅有一种可能,就是进入了一个曾经经历过的格局。那么就可以构造出 的判定器了。 “在输入 上,在 LBA 上运行 步,如果接受了就接受,如果拒绝了或者没停机,就拒绝。”
然而, 是不可判定的。证明思路是证明 可归约到 。
跟之前的思路一样,假设判定器 判定 ,那么就可以构造出一个判定器 判定 。
“在输入 上,
- 构造一个 LBA ,这个 LBA 的输入是 ,它判断 是否是 在 上的一个接受计算历史。也就是说,只有输入的 是 在 上的一个接受计算历史,才接受。所以, 包含了 在 上的所有的接受计算历史。
- 然后,用 来判断 是否是 。如果不是空集,意味着存在接受计算历史,也就意味着图灵机 最终接受 ,所以 ,那么 的判定器 就接受,否则 拒绝。”
接下来考虑 LBA 怎么构造。
“在输入 上(注意 的形式是一个计算历史的编码),
- 检查 是否是 开头的( 是 在 上的起始格局)
- 再检查是否每一个 都能合法的从 转移过来
- 然后再检查最后一个格局是否是接受格局。
- 如果三项检查都通过了,意味着输入的 是一个接受计算历史,那么 就接受。如果任意一项检查没有通过,就拒绝。”
波斯特对应问题 Post Correspondence Problem
令语言 。接下来证明 语言 是不可判定的。
证明 可归约到 。利用计算历史方法(很像是归约法)。
先考虑简单情况,即匹配必须以 开头。
假设图灵机 判定 ,那么就能够用 造出一个图灵机 判定 。
“在输入 上,
- 构造一个 PCP 的实例 使得匹配都是 在 上的接受计算历史(稍后说明如何构造 )。
- 然后用 来判定 是否拥有匹配。如果有匹配,说明 在 上有接受计算历史,意味着 最终会接受 。若 接受, 就接受,否则 就拒绝。”
于是, 就可以判定 ,但这不可能,假设不成立,故 不可判定。
接下来描述如何构造出 。考虑起始骨牌 ,
关于如何构造 一直都还没学明白。。。
虽然说 不可判定,但是 图灵可识别。因为可以不停的尝试各种的可能的匹配(可能会耗时无限久)。于是可以根据「一个语言可判定,当且仅当既是图灵可识别又是补图灵可识别的」得到一个没啥用的推论: 不是补图灵可识别的。
不可判定
张老师说其实跟证明 PCP 的不可判定性一模一样的。待补充。
语言问题可判定性总结
| DFA | CFG | LBA | TM | |
|---|---|---|---|---|
| 接受性 A | ||||
| 空性 E | ||||
| 等价性 EQ | ||||
| 满性 ALL | ||||
| 停机性 HALT | ||||
| 正则性 REGULAR |
常见形式语言分类
(都不属于更低一层)
| 语言类 | 语言示例 |
|---|---|
| 非图灵可识别 | ,,, |
| 图灵可识别 | ,,, |
| 可判定 | ,, |
| 上下文有关 | ,,接受计算历史 |
| 上下文无关 | ,,非 ,非 ,非接受计算历史 |
| 正则 |
语言类封闭性总结
| 补 | 交 | 并 | 连接 | 星号 | |
|---|---|---|---|---|---|
| 图灵可识别(TM) | |||||
| 可判定(TM) | |||||
| 上下文有关(LBA) | |||||
| 上下文无关(PDA) | |||||
| 正则(DFA) |