【笔记】可计算理论

发布时间 2023-12-04 23:45:07作者: zrkc

计算模型

Def. 确定图灵机 (Deterministic Turing Machine, DTM)

7 元组,记作 \(M=(Q,\Sigma,\Gamma,\delta,q _0, B, F)\),其中

  • \(Q\) 是有穷状态集合
  • \(\Sigma\) 是有穷输入符号集合
  • \(\Gamma\) 是有穷带上符号集,\(\Sigma\sube\Gamma\)
  • \(q _0\) 是图灵机的起始状态
  • \(F\sube Q\) 是停机(接受)状态集合
  • \(B\in\Gamma/\Sigma\) 是空字符
  • \(\delta\) 是形如 \((Q/F)\times \Gamma\to Q\times \Gamma\times\{L, R\}\) 的转移函数
    例如,\(\delta(p,a)=(q,b,L)\) 定义动作:当机器处于状态 \(p\),并且带头指向格子内容为 \(a\) 时,执行:将 \(a\) 改成 \(b\),进入状态 \(q\),带头左移一格

\(M\) 停机,当且仅当 \(M\) 进入接收状态,或者找不到可用的转移规则

图灵机计算过程的瞬时描述 (ID),形如:\(X _1 X _2\dotsb X _{i-1} q X _i X _{i+1}\dotsb X _n\),表示:

  • 图灵机的当前状态是 \(q\)
  • 图灵机带上的内容为 \(X _1 X _2\dotsb X _n\)
  • 图灵机的带头正在扫描 \(X _i\)

瞬时描述的移动,即图灵机的一步计算,表示为 \(⊢\);多次移动(多步计算)可以表示为 \(⊢ ^ * , ⊢ ^ * _M\)

Def. 图灵机 \(M\) 的语言(\(M\) 识别的语言)
给定图灵机 \(M\) 和字符串 \(w\in\Sigma ^ { * }\),如果存在 \(M\) 的瞬时描述序列 \(ID _1,ID _2,\dotsb, ID _k\),满足如下条件,则称 \(M\) 接受 \(w\)

  • \(ID _1\)\(M\) 初始状态的瞬时描述,为 \(q _0 w\)
  • \(ID _k\)\(M\) 的某个接受状态
  • \(ID _{i}⊢ ID _{i+1}, i\in [k-1]\)

\(M\) 接受的字符串集合称为 \(M\) 的语言,或 \(M\) 识别的语言,记作 \(L(M)\)
显然,若 \(w\notin L(M)\),则 \(M\) 要么停机且拒绝,要么永远不停机

图灵机有很多变种,它们彼此等价(所谓等价,指两者识别相同的语言类,或者证明它们可以互相模拟)
例如,我们可以令带头动作变为 \(\{L,R,S\}\),但它不能比原本的图灵机更好,因为我们可以简单地用 \(L+R\) 模拟 \(S\)
我们再介绍几个变种:

  • 多带图灵机:它有 \(k\) 个带,各自具有读写头;开始时我们的输入放在第一个带上,其他带是空白的,转移函数为 \(\delta:Q\times \Gamma ^ k\to Q\times \Gamma ^k\times \{L, R, S\} ^k\)
    显然,这 \(k\) 个带子可以视为在一个带子上用某个指定分隔符隔开的 \(k\) 个段;并且我们可以用一个技巧描述这个带上各段当前所指字符:只需为字符 \(a\) 引入 \(\dot{a}\) 即可,毕竟我们的字符集是有限的;于是我们可以用单带模拟多带,从而两者是等价的
    单带图灵机模拟多带图灵机时间代价:平方级别
  • 非确定图灵机:转移函数形如 \((Q/F)\times \Gamma\to 2 ^{Q\times \Gamma\times\{L, R\}}\);而字符串 \(w\) 被接受当且仅当存在转移序列使得 \(q _0 w⊢ ^ * \alpha p\beta,p\in F\)

在之后关于“可计算性”的讨论中,我们将“问题”视为一种“语言”,将“算法”视为一种“图灵机”,从而我们考虑的是“某个图灵机之于某个语言”
这是因为,我们总能将问题的输入对象进行编码(下文用 \(\lang\cdot, \cdots\rang\) 表示),并尝试在其上运行一个能识别它的图灵机(或者不存在、或者不停机)
算法又何以成为图灵机?我们直接认为,我们对算法的直观概念,等价于图灵机算法(丘奇-图灵论题),它的一个常见表述是:

丘奇-图灵论题
每个有效计算都可以由一台图灵机完成。

可计算理论 Theory of Computability

识别/判定

注意到图灵机语言的定义,并没有讨论永不停机的情况,从应用的角度,不停机就不是算法了;因此我们基于“识别”,引入不停机的条件,进一步提出“判定”概念

Def. 图灵机 \(M\) 的语言(\(M\) 识别的语言)
\(M\) 接受的字符串集合称为 \(M\) 的语言,或 \(M\) 识别的语言,记作 \(L(M)\)
Def. 图灵机 \(M\) 的语言(\(M\) 判定的语言)
如果图灵机 \(M\) 是始终停机的(称为判定器),那么也称 \(L(M)\) 为图灵机 \(M\) 判定的语言

进一步地,我们用图灵机的识别/判定行为,定义语言种类

Def. 图灵可识别语言 (Turing‐Recognizable Language)
如果存在图灵机 \(M\) 识别语言 \(L\),那么 \(L\) 是一个图灵可识别语言 Turing-recognizable
Def. 图灵可判定语言 (Turing‐Decidable Language)
如果存在图灵机 \(M\) 判定语言 \(L\),那么 \(L\) 是一个图灵可判定语言 Turing-decidable

Th. 判定 \(\sube\) 识别
如果图灵机 \(M\) 判定 \(L\),那么 \(M\) 一定识别 \(L\)
如果语言 \(L\) 是图灵可判定的,那么 \(L\) 一定是图灵可识别的

现在我们回到所谓“可计算”上:对于某个问题,它具有无穷个实例 instance,而我们关注的是这个问题是否有算法。
而现在,我们将问题视作语言 language,将实例视作字符串 string,那么,这个问题能否计算,就转化为是否存在一个(某种)图灵机能判定这个语言
当然,所谓 “给定一个(某种)图灵机,能否判定一个语言” 本身也是一个问题,也能用语言描述,因此我们引入一般的表达形式:
我们用 \(\lang \cdot,\dotsb\rang\) 表示编码,它只需要我们事先约定即可,关于它的细节一般不再赘述,下文同理

Def. 问题 \(\lrArr\) 语言
考虑一个问题:“检测对于一个特定的图灵机 \(M\) 和一个给定的串 \(w\),命题 \(\text{Cond}(M, w)\) 是否成立”
对它,先将所有成立的二元组 \((M,w)\) 的编码的集合视作语言 \(A _{TM}\)

\[A _{TM}= \{ \lang M, w\rang : M\text{ 是 } TM, \text{满足条件 Cond}(M,w)\} \]

从而,证明命题 \(\text{Cond}(M, w)\) 成立,等价于证明 \(\lang M,w\rang\in A _{TM}\),从而我们用语言 \(A _{TM}\) 等价描述了上述的问题

例如,可以令命题为 \(\text{Cond}(M, w)\) 为 “\(M\) 接受 \(w\)”;进而,要证明该命题可计算(即 M 判定 w 可以在有限时间得出该命题是否成立;这和 \(M\) 判定 \(w\) 还是有区别的),等价于证明 \(A _{TM}\) 是可判定的
此外,图灵机就是算法,图灵机可以调用图灵机(实现方法为模拟被调用图灵机的运行),这个思路需要多加强调
例如,现在有一个问题:“给定一个 DFA \(D\) 和一个串 \(w\),判断 \(D\) 是否接受 \(w\)
现在考虑语言 \(A _{DFA} = \{\lang D, w\rang:D是DFA且接受w\}\)
那么:

  • 该问题判断 “\(D\) 是否接受 \(w\)”,等价于判断 \(\lang D, w\rang\) 是否属于 \(A _{DFA}\)
  • 要证明该问题是可解的,等价于证明 \(A _{DFA}\) 是可判定的(证明只需设计图灵机 \(M\)\(w\) 上模拟 \(D\) 运行即可,这个图灵机就是这个问题的算法)

我们再为可识别/可判定介绍等价概念:递归可枚举的、递归的

Def. 枚举图灵机
枚举图灵机 (enumerator) 是一个多带图灵机:

  • 初始状态,工作带为空,即无输入
  • 有一条特殊输出带,带头只能右移,在输出带上顺序打印有穷长度的字符串,字符串的数目可能是无穷的,字符串可以重复打印
    例如,可以按照如下方式工作:
    • 运行中进入一个特殊的状态 \(q _\text{print}\),该状态将工作带上的内容复制到输出带上,利用 \(\#\) 字符分隔
    • 复制后,机器返回常规状态继续运行
  • 枚举图灵机 \(E\) 的语言 \(L(E)=\{x : E \text{ 输出 } \cdots\#x\#\cdots\}\),也称为 \(E\) 枚举 \(L(E)\)

实际上,枚举图灵机 \(E\) 和图灵机 \(M\) 可以互相模拟;分类讨论:

  • 与一般图灵机(非判定器)相互模拟的枚举图灵机,它不能按字典序输出字符串(否则存在判定器判定它的语言,原因见下):
    • 若有 \(E\) 枚举 \(A\),则构造 \(M\),对于输入 \(w\):运行 \(E\),并将其每次的输出与 \(w\) 比较,若匹配则接受,否则继续(显然若 \(w\notin A\),则 \(M\) 无法停机)
    • 若有 \(M\) 识别 \(A\),则构造 \(E\),按字典序依次枚举 \(\Sigma ^ { * }\) 的所有字符串 \(s _1,s _2,\dotsb\);如果我们简单地依次对每个字符串运行 \(M\),那要是 \(M\) 不停机了怎么办呢?我们可以限制 \(M\) 的运行次数,让其强行停机——迭代,每次对前 \(i\) 个字符串 \(s _1,\dotsb, s _i\),依次送入 \(M\) 且分别至多运行 \(i\) 步,若某个字符串被接受则输出——此时每个 \(s _j\in A\) 会被输出无穷次(当然,输出前扫一遍之前的输出,可以令只输出一次)
  • 与判定器相互模拟的枚举图灵机,它可以按字典序输出字符串:
    • 若有 \(E\) 枚举 \(A\),则构造 \(M\) 同上,此时由于 \(E\) 按字典序输出,则 \(M\) 只需多加判断字典序大小并及时退出,故必定能停机
    • 若有 \(M\) 识别 \(A\),则构造 \(E\),按字典序依次枚举 \(\Sigma ^ { * }\) 的所有字符串 \(s _1,s _2,\dotsb\),并依次对每个字符串运行 \(M\),且 \(M\) 必定停机

根据上述方法,我们又证明了两组等价关系:

Def. 递归可枚举语言 (recursively enumerable, r.e.)
如果存在枚举图灵机 \(E\) 满足 \(L=L(E)\),那么 \(L\) 是递归可枚举语言
Th. 递归可枚举 \(\lrArr\) 图灵可识别
语言 \(L\) 是递归可枚举的,当且仅当 \(L\) 是图灵可识别的

Def. 递归语言 (recursive)
如果存在枚举图灵机 \(E\) 满足 \(L=L(E)\)并且 \(E\) 以字母序打印 \(L(E)\),则称 \(L\) 是递归语言
Th. 递归 \(\lrArr\) 图灵可判定
语言 \(L\) 是递归的,当且仅当 \(L\) 是图灵可判定的

因此,从问题看,有等价关系:可计算 \(\lrArr\) 可判定 \(\lrArr\) 递归语言
现在让我们回到可判定、可识别语言上,我们考虑一下运算封闭性:

Th. 可判定(可识别)语言的运算封闭性
已知语言 \(A\)\(B\) 是可判定(可识别)的,则如下语言是可判定(可识别)的:

  • \(A∪B\)\(A\cap B\)
  • \(A\cdot B=AB=\{xy:x\in A, y\in B\}\)
  • \(A ^ * = \cup _{n=0} ^{\infty} A ^ n, A ^ 0=\{\epsilon\},A ^n = A A ^{n-1}\)
  • 关于补操作 \(\bar{A}\)
    • 可判定语言对补操作封闭
    • 可识别语言对补操作不封闭(无法停机无法对应构造使得对该字符串停机)
      但是倘若 \(A,\bar{A}\) 均为可识别,则 \(A(\bar{A})\) 均为可判定,证明显然,只需同时运行 \(A,\bar{A}\),至少有一个停机;事实上有定理:

Th. 图灵可判定等价条件
语言 \(L\) 是图灵可判定的,当且仅当 \(L\) 及其补语言 \(\bar{L}\) 均是图灵可识别的

总结一下,现在我们根据可识别、可判定,对一个语言 \(L\) 做出如下分类:

  • \(L\)\(\bar{L}\) 都是图灵可识别的,即都是图灵可判定的
  • \(L\) 是图灵可识别的,\(\bar{L}\) 不是图灵可识别的
  • \(\bar{L}\) 是图灵可识别的,\(L\) 不是图灵可识别的
  • \(L\)\(\bar{L}\) 都不是图灵可识别的

对这些类别,接下来我们分别讨论

不可识别

首先,是否存在不可识别语言呢?

从计数可以证明是存在的:语言的个数为 \(|2 ^{\Sigma ^ * }|\),是不可数的(\(\Sigma ^ { * }\) 可数);而可以对图灵机进行编码,使得每个图灵机至少与一个 01 串对应,故图灵机可列,等价于自然数,是可数的;因此语言数量远多于图灵机数量,一定存在某个语言不对应任何一个图灵机,证毕
另外,介绍一种图灵机编码方式(编码只是到 \(\Sigma ^{ * }\) 的一种映射罢了)
\(M=(\{q _0, q _1,\dotsb, q _n\},\{0, 1\}, \{0, 1, B\},\delta,q _0, \{q _1\})\) 为例:
\(X _1=0, X _2 = 1, X _3=B,D _1 = L,D _2=R\)
\(\delta(q _i,X _j)=(q _k,X _l, D _m)\) 编码为 \(code=0 ^{i+1}10 ^ j 1 0 ^{k+1}1 0 ^l 1 0 ^m\)
假设图灵机 \(M\)\(r\) 条转移规则,则将 \(M\) 编码为 \(code _1 11 code _2 11\dotsb 11 code _r 111\)
显然,每个图灵机对应有限个 01 串,每个 01 串不一定是一个合法图灵机

既然存在,那么又如何证明一个语言的不可识别呢?可以考虑对角化方法,或者归于某个已知不可识别语言的可识别性
给出一个不可识别语言的例子:

Def. 对角化语言 \(L _d\)
\(M _i\) 表示按字典序第 \(i\) 个字符串 \(w _i\) 编码的图灵机,又即 \(w _i=\lang M _i\rang\) ;若 \(w _i\) 不是合法的编码,则 \(L(M _i)=\empty\)(一种编码方法很容易存在不合法的编码)
对角化语言定义为

\[L _d = \{w _i : w _i\notin L(M _i)\} \]

Th. 对角化语言 \(L _d\) 不可识别(进而不可判定)

证明
显然,不合法编码的存在使得 \(L _d\) 非空,现在我们来证明 \(L _d\) 不可识别
重温经典:对角化方法
假设存在 \(M _j\) 能够判定 \(L _d=L(M _j)\),那么当我们考察 \(w _j\) 时,会发现假设 \(w _j\in L(M _j)\),则 \(w _j\notin L _d=L(M _j)\),矛盾;假设 \(w _j\notin L(M _j)\),则 \(w _j\in L _d=L(M _j)\),又矛盾,故原假设不成立
之所以叫做“对角线语言”,是因为以下图为例,两个取反的序列会在右下角相撞:

\[\begin{array}{c|cc} &\lang M _0\rang&\lang M _1\rang&\lang M _2\rang&\dotsb&\color{royalblue}{w _j}\\ \hline M _0&\color{deeppink}0&1&1&\dotsb\\ M _1&1&\color{deeppink}0&1&\dotsb\\ M _2&0&0&\color{deeppink}1&\dotsb\\ \vdots&\vdots&\vdots&\vdots&\ddots\\ \color{royalblue}{M _j}&\color{royalblue}1&\color{royalblue}1&\color{royalblue}0&\dotsb&\color{royalblue} ? \end{array} \]

证明其他一些问题不可识别,可以尝试对角线方法;或者反证法,假设其可识别,从而通过将一些已知不可识别语言的识别任务交给这个代证语言,得到矛盾

Exercise.\(w _i\) 表示第 \(i\) 个字符串,\(M _i\) 为对应编码的图灵机,证明语言 \(\{w _j : w _{2j} \notin L(M _{j})\}\) 是非递归可枚举的(图灵可识别的)
(提示:考虑 \(L'= \{w _{2j}: w _{2j} \notin L(M _j)\}\) 是否递归可枚举)

可以证明 \(\{w _{2j} : w _{2j} \notin L(M _{j})\}\) 是不可识别的,因为假设 \(M _k\) 识别该语言,则 \(w _{2k}\in L(M _k)\rArr w _{2k}\notin L(M _k),w _{2k}\notin L(M _k)\rArr w _{2k}\in L(M _k)\),都矛盾
接下来证明 \(\{w _j : w _{2j} \notin L(M _{j})\}\) 不可识别,假设可识别且图灵机 \(M\) 识别之,则可证明 \(\{w _{2j} : w _{2j} \notin L(M _{j})\}\) 也可识别,因为只需对于输入的 \(w _{2j}\),判断 \([w _j\in L(M)]\) 即可,故矛盾,故得证

或者利用定理:\(L\) 可判定当且仅当 \(L,\overline{L}\) 可识别的;从而要证明 \(L\) 不可识别,可以考虑证明 \(L\) 不可判定、\(\overline{L}\) 可识别

不可判定

那么,是否存在可识别但不可判定的语言呢?如何证明不可判定呢
先介绍几个基本问题。\(L _{ACC}\) 是一个很重要的问题,后面也 turns out 是个重要模板的组成部分

Def. 图灵机接受问题 \(L _{ACC}\)

\[L _{ACC}=\{ \lang M, w\rang : M \text{ 是图灵机}, M \text{ 接受 } w \} \]

Th. \(L _{ACC}\) 是图灵可识别的

证明很简单,构造“通用图灵机” \(M _u\) 为一个能够模拟图灵机运行的图灵机:对于输入 \(\lang M, w\rang\)(任何可以表示的方法,不要总想着 01 编码),执行:

  1. 检查 \(M\) 的合法性
  2. \(w\) 上模拟 \(M\) 运行(只需多带记录 \(M\) 的当前状态和转移即可)
  3. \(M\) 接受 \(w\),则 \(M _u\) 接受 \(\lang M, w\rang\)
    \(M\) 拒绝 \(w\),则 \(M _u\) 拒绝;不停机不做定义

后文中我们提到“模拟 \(M\)\(w\) 上运行”,都是指这个实现方式。于是 \(M _u\) 识别 \(L _{ACC}\);显然 \(M _u\) 不足以判定 \(L _{ACC}\),实际上 \(L _{ACC}\) 不可判定,即图灵机接受问题不可计算

Th. \(L _{ACC}\) 不是图灵可判定的
Co. \(\overline{L _{ACC}}\) 不是图灵可识别的

采用对角线法证明:
假设图灵机 \(H\) 判定 \(L _{ACC}\),对于输入 \(\lang M, w\rang\)\(H\) 总能停机,且输出 \(H(\lang M, w\rang)\) 为根据 \(M\) 是否接受 \(w\) 也输出接受与否
接下来构造图灵机 \(D\),并认为其输入的字符串为图灵机编码 \(\lang M\rang\),调用 \(H(M, \lang M\rang)\) 并且总是输出和 \(H\) 相反的结果:\(D(\lang M\rang)=1-H(M, \lang M\rang)\)
由于编码可列,图灵机是可列的,将其列成 \(M\)-\(\lang M\rang\) 的矩阵,并考虑 \(H(M, \lang M\rang)\)\(D(\lang M\rang)\) 的真值,它们在右下角相撞:

\[\begin{array}{c|cc} &\lang M _0\rang&\lang M _1\rang&\lang M _2\rang&\dotsb&\color{royalblue}{\lang D\rang}\\ \hline M _0&\color{deeppink}0&1&1&\dotsb\\ M _1&1&\color{deeppink}0&1&\dotsb\\ M _2&0&0&\color{deeppink}1&\dotsb\\ \vdots&\vdots&\vdots&\vdots&\ddots\\ \color{royalblue}{D}&\color{royalblue}1&\color{royalblue}1&\color{royalblue}0&\dotsb&\color{royalblue} ? \end{array} \]

因此产生矛盾,\(D,H\) 不存在,从而得证

Def. 图灵机停机问题 \(L _{HALT} = \{ \lang M, w\rang : M \text{ 是图灵机}, M \text{ 在 } w \text{ 上停机} \}\)
Th. \(L _{HALT}\) 是图灵可识别的
Th. \(L _{HALT}\) 不是图灵可判定的
Co. \(\overline{L _{HALT}}\) 不是图灵可识别的

证明。显然是可识别的;现在证明不可判定:假设 \(M _{HALT}\) 判定 \(L _{HALT}\),即 \(M _{HALT}\) 能判定 \(\lang M, w\rang\) 是否停机;
那我们可以构造图灵机完成对 \(L _{ACC}\) 的判定:给定 \(\lang M, w\rang\),先调用 \(M _{HALT}(\lang M, w\rang)\) 判断是否停机,如果不停机则不接受;否则模拟 \(M(w)\),从而给出结果;这与 \(L _{ACC}\) 不可判定矛盾,故得证

如上所示,将待证明的可判定性归于 \(L _{ACC}\) 的可判定性,是一个常见的证明方法;下文再举几例:

Def. \(L _{e}=\{\lang M\rang:M \text{ 是图灵机},L(M)=\empty\}\)
Th. \(L _{e}\) 不是图灵可判定的
Co. \(\overline{L _{e}}\) 是图灵可识别的,\(L _e\) 不是图灵可识别的

乍一看,\(L _{e}\) 拒绝所有字符串,似乎是个非常直白的问题;但是从算法的角度,我们找不到一个判定器,能够判断一个图灵机是否是拒绝所有非空字符串的
证明:假设存在 \(M _{e}\) 判定 \(L _{e}\);构造图灵机判定 \(L _{ACC}\),给定 \(\lang M, w\rang\)
考虑在 \(\lang M\rang\) 上运行 \(M _{e}\),如果接受,则 \(w\notin L(M)=\empty\);否则只能说明 \(L(M)\ne\empty\)
现在考虑构造修改图灵机 \(M'\),先判断输入是否为 \(w\),否则拒绝,是则调用 \(M\),于是 \(L(M')=\{w\}\cap L(M)\);现在我们在 \(\lang M'\rang\) 上运行 \(M _e\),如果接受,说明 \(w\notin L(M')=\empty\);如果拒绝,说明 \(w\in L(M')=\{w\}\ne \empty\)
从而构造出 \(L _{ACC}\),矛盾!从而得证
这就把矛盾卡出来了,总结来说,是因为考虑 \(M _e(\lang M\rang)=[L(M)=\empty]\),而 \(w\in L(M) \lrArr \{w\}=\{w\}\cap L(M)\triangleq L(M')\),所以判断 \(M _e(\lang M'\rang)\) 就能说明问题了
这又一次提示我们,可以将我们手头有的东西归于 \(L _{ACC}\) 的功能

快速再给几个例子:

Exercise. \(L _{ACCALL}=\{\lang M\rang:M \text{ 是图灵机},M \text{ 接受所有字符串} \}\) 不是图灵可判定的

\(M _{ACCALL}(\lang M\rang)=[\Sigma ^ * \sube L(M)]\),而我们要判断 \([w\in L(M)]\)
对给定 \(\lang M, w\rang\)
\(M'(x)\triangleq[w\in L(M)]\),为对任意 \(x\in\Sigma ^{ * }\),总是模拟 \(M\)\(w\) 上运行,并返回模拟结果,即 \(\color{deeppink}{[x\in L(M')]=[w\in L(M)]}\),这一步是利用 \(M _{ACCALL}\) 的能力直接预知了模拟结果
\([x\in L(M')]=M _{ACCALL}(\lang M'\rang)\)
则构造图灵机 \(M _{ACC}\):在 \(M _{ACCALL}\) 上运行 \(\lang M'\rang\),并返回结果即可;故矛盾

这个证明告诉我们直接通过 “返回模拟结果/返回运行结果” 可以建立判定式之间的相等联系,就如 deeppink 颜色式子所示

Exercise. \(L _{REG}=\{\lang M\rang:M\text{ 是图灵机, 且接受正则语言}\}\) 不是图灵可判定的

这个的证明和 \(L _{ACCALL}\) 差不多,限制一下某个正则语言即可:
\(M'(x)\triangleq[x = 0 ^n]\& [w\in L(M)]\),为先判断是否为 \(0 ^n\),再模拟 \(M(w)\) 并返回运行结果,则 \(L(M')=\begin{cases} 0 ^n &;w\in L(M) \\ \empty &;w\not\in L(M)\end{cases}\)
\(L _{REG}(\lang M'\rang)=[L(M')=\text{REG}]=[L(M')=0 ^n]=[w\in L(M)]\)
可见这里是把 \([w\in L(M)]\) 作为条件加入的,这不失为一种模板,后面规约中会进行总结

Exercise. \(L _{palindrome}=\{\lang M\rang:L(M) = \{w:w \text{ 是回文串}\}\}\) 不是图灵可判定的

\(M'(x)\triangleq [x=00]\& [w\in L(M)]\),为先判定是否为 \(00\),再模拟 \(M(w)\) 并返回运行结果,则 \(L(M')=\begin{cases} 00 &;w\in L(M) \\ \empty &;w\not\in L(M)\end{cases}\)
\(L _{palindrome}(\lang M' \rang)=[L(M') \text{ 回文}]=[L(M') = 00] = [w\in L(M)]\)

Exercise. \(L _{R}=\{\lang M\rang:L(M) = (L(M)) ^ R\}\) 不是图灵可判定的(即若 \(w\in L(M)\),则 \(w ^R\in L(M)\)

\(M'(x)\triangleq [x=01]\& [w\in L(M)]\)
\(L _R(\lang M'\rang)=[L(M')=(L(M')) ^R]=[L(M')=\empty]=[w\in L(M)]\)(这里我认为 \(\empty=\empty ^R\),所以这么设计)

Exercise. \(L _{R}=\{\lang M\rang:L(M) = (L(M)) ^ R\}\) 不是图灵可识别

可以考虑证明 \(L _{R}\) 不可判定、\(\overline{L _R}\) 可识别,前者上题已经证了,考虑证明 \(\overline{L _R}\) 可识别。构造图灵机 \(M'\),对于输入 \(\lang M\rang\),按字典序枚举字符串 \(w\),在 \(w, w ^R\) 上分别运行 \(M\),若结果不同则接受。可见 \(M'\) 识别 \(\overline{L _R}\),得证

再小提一句,之所以这个方法不能用在 \(L _R\) 上,是因为我们无法定义什么时候接受(接受状态)——在 \(w, w ^R\) 上分别运行 \(M\),若结果相同,我们还得继续运行下去
这个小问题让我想到,如果一开始我们对图灵机的定义里,把“接受状态”改为“拒绝状态”,是不是会有一类问题的结论变成补集了呢?

映射规约

上述问题都具有一个相同的过程:将一个问题归于另一个问题,这提示我们,问题彼此之间是否具有某种可以“归约”的关系?

归约(reduction)支持将问题按计算难度分层(排序)。例如,问题 \(A\) 可以归约到问题 \(B\),记作 \(A\le B\),直观表示 \(A\) 不会比 \(B\) 更困难

Def. 可计算函数(Computable functions)
函数 \(f:\Sigma _1 ^ * \to \Sigma _2 ^{ * }\) 被称作是可计算的,若存在图灵机 \(M\) 使得 \(\forall w \in \Sigma _1 ^{ * }\)\(M\)\(w\) 上停机且输出带上是 \(f(w)\)
其实就是存在图灵机能有限时间计算出 \(f\)

Def. \(\le _m\),映射规约(Mapping reduction)
\(A\sube \Sigma ^ * _1\)\(B\sube \Sigma ^ * _2\) 是两个语言,\(A\) 被称作可映射归约到 \(B\),记作 \(A\le _m B\),若存在可计算函数 \(f:\Sigma _1 ^ * \to \Sigma _2 ^{ * }\),使得 \(\forall w\in \Sigma ^ * _1\)\(w\in A \lrArr f(w)\in B\)
这里的函数 \(f\) 被称作从问题 \(A\)\(B\) 的映射归约
映射规约具有如下性质,从而映射规约是个很有用的方法/方向:

Th. \(\le _m\) 的性质

  • \(A \le _m B\),则:
    • \(B\) 可判定,则 \(A\) 可判定
      \(A\) 不可判定,则 \(B\) 不可判定(逆否命题)
    • \(B\) 可识别,则 \(A\) 可识别
      \(A\) 不可识别,则 \(B\) 不可识别(逆否命题)
  • \(A \le _m B\lrArr\overline{A}\le _m\overline{B}\)
  • \(A \le _m B,B \le _m C\rArr A \le _m C\)

例如:
\(L _d = \{\lang M\rang: \lang M\rang\notin L(M)\}\),则 \(\lang M\rang \in L _d \lrArr \lang M\rang\notin L(M) \lrArr \lang M, \lang M\rang\rang\in \overline{L _{ACC}}\),故映射规约 \(f:\lang M\rang\mapsto \lang M, \lang M\rang\rang\) 是映射规约,从而 \(L _d\le _m \overline{L _{ACC}}\),所以 \(L _d\) 是不可识别的
又比如,\(\lang M\rang\in L _{ACCALL} \lrArr \lang M, \Sigma ^ * \rang\in L _{ACC}\),则 \(f:\lang M\rang\mapsto \lang M,\Sigma ^ * \rang\) 是映射规约,从而 \(L _{ACCALL}\le _m L _{ACC}\),所以 \(L _{ACCALL}\) 是不可判定的
反过来,\(\lang M, w\rang\in L _{ACC}\lrArr \lang M'\rang\in L _{ACCALL}\),其中 \(M'\) 定义为对任意输入,都模拟 \(M\)\(w\) 上运行,接受则接受,否则拒绝(如上文提到),则 \(L _{ACC}\le _m L _{ACCALL}\)

Remark. 模板

  • 要证明语言 \(L _{some}\) 不可识别,可以考虑证明 \(\overline{L _{ACC}}\le _m L _{some}\),即证明 \(L _{ACC}\le _m \overline{L _{some}}\)
  • 要证明语言 \(L _{some}\) 不可判定,可以考虑证明 \(L _{ACC}\le _m L _{some}\)

因此,很多问题都可以归于证明 \(L _{ACC}\le L _{some}\)(无论是利用取补或者逆否),大概证明思路都是 \(\lang M, w\rang\in L _{ACC}\lrArr \lang M'(,\dotsb)\rang\in L _{some}\)
这个 \(M'\) 先让自己限定在满足 \(L _{some}\) 条件(的某个子集)内;然后模拟 \(M\)\(w\) 上运行,若 \(w\in L(M)\) 则实现这个条件,否则不实现
这样的话,\(M'\) \(w\in L(M)\) 为唯一条件、以满足 \(L _{some}\) 的条件,于是 \(\lang M, w\rang\in L _{ACC}\lrArr \lang M'\rang\in L _{some}\)

Exercise. \(L _{HALT} = \{ \lang M, w\rang : M \text{ 是图灵机}, M \text{ 在 } w \text{ 上停机} \}\) 不可判定

证明,考虑 \(L _{ACC}\le L _{HALT}\),也就是要构造映射规约 \(f:\lang M, w\rang\mapsto\lang M', w'\rang\),使得 \(\lang M, w\rang\in L _{ACC}\lrArr \lang M', w'\rang\in L _{HALT}\),如何令 \(M\) 停机以 \(w\in L(M)\) 为唯一条件?很简单,对任意 \(w'\),都令 \(M'\) 先模拟 \(M\)\(w\) 上运行,若接受则直接停机,否则就进入一个永不停机的状态,这样就完成证明了

还记得我们之前怎么证明的吗?我们利用 \(L _{HALT}\) 造出了一个判定 \(L _{ACC}\) 的玩意,从而导出矛盾。这两个证明应该还是有区别的

利用这个方法,我们可以证明这样一个语言——本身和补集都是不可识别的:\(L _{EQ}\)

Th. \(L _{EQ}=\{\lang M _1, M _2\rang : L(M _1) = L(M _2) \}\) 不是图灵可识别的
Th. \(\overline{L _{EQ}}\) 不是图灵可识别的

证明 \(L _{EQ}\):可以考虑证明 \(\overline{L _{ACC}}\le _m L _{EQ}\),取补 \(L _{ACC}\le _m\overline{L _{EQ}}\),这就是经典结构了。取 \(M _1,M _2\),如何让 \(w\in L(M)\lrArr \lang M _1, M _2\rang\in \overline{L _{EQ}} \lrArr L(M _1)\ne L (M _2)\) 呢?令 \(L(M _1)=\empty\) 也就是拒绝所有输入,\(L(M _2)\) 接受当且仅当模拟 \(M\)\(w\) 上运行且接受,这样就得到了 \(f:\lang M, w\rang\mapsto \lang M _1, M _2\rang\)
证明 \(\overline{L _{EQ}}\):可以考虑证明 \(\overline{L _{ACC}}\le _m \overline{L _{EQ}}\),取补 \(L _{ACC}\le _m L _{EQ}\),这和上面不是一样嘛,让 \(M _1\) 接受所有输入就行了

下面再介绍一个更一般的规约:图灵归约

Def. 神谕图灵机(Oracle Turing machine)
一个图灵机变种,可以查询某个语言判定问题的结果是 \(1\) 或者 \(0\)\(M ^B\) 表示可以查询语言 \(B\) 的 oracle 图灵机,即判定 \(M ^B(w)=[w\in B]\)
Def. \(\le _T\),图灵规约(Turing reduction)
\(A\sube \Sigma ^ * _1\)\(B\sube \Sigma ^ * _2\) 是两个语言,\(A\) 被称作可图灵归约到 \(B\),记作 \(A\le _T B\),若存在 Oracle 图灵机 \(M ^B\) 判定 \(A\)
Th. \(A\le _m B\rArr A\le _T B\)

证明,按照如下方式构造 \(M ^B\):对于查询 \([x\in A]\),利用映射规约 \(f\),计算 \(f(x)\) 并在 \(M ^B\) 上查询 \([f(x)\in B]\),返回查询的结果

莱斯定理(Rice's theorem)

现在让我们回过头观察这些不可判定问题,为什么很多情况它们的证明如此相似(比如那个模板)?
本质上,这是“图灵机识别语言”的性质,我们从一些更上层的角度观察
介绍莱斯定理(Rice's theorem),它表明任何图灵机识别语言的非平凡性质都是不可判定的

Def. 图灵机识别语言的非平凡性质(Nontrivial properties)
\(P\) 是图灵机识别语言的非平凡性质,或者说是具备某个性质的语言集合,当且仅当

  • 存在图灵机 \(M _1\) 使得 \(L(M _1)\in P\)
  • 存在图灵机 \(M _2\) 使得 \(L(M _2)\notin P\)

它的等价形式为:

  • 存在某个图灵可识别的语言 \(L _1\in P\)
  • 存在某个图灵可识别的语言 \(L _2\notin P\)

显然,非平凡性质 \(P\) 的补集 \(\overline{P}\) 依然是非平凡性质
例如,我们上面讨论的语言都是具有非平凡性质的

Th. 莱斯定理(Rice's theorem)
\(P\) 是图灵可识别语言的任意一个非平凡性质,并且语言 \(L _P = \{\lang M\rang : L(M)\in P\}\),那么 \(L _P\) 是不可判定的

能有如此结论真是 amazing 啊!这样的话,我们试证不可判定,只需考虑证明性质非平凡就行了

证明其实就是我们上面发现的模板,咱也属于是站在巨人肩膀上发现风景了
试证明 \(L _{ACC}\le _m L _P\),回顾模板分析一下:目标就是构造使得 \(\lang M, w\rang\in L _{ACC}\lrArr f(\lang M, w\rang)=\lang M'\rang\in L _P\),意味着某个图灵机 \(M'\),它以 \(w\in L(M)\) 为条件、接受满足条件 \(P\) 的输入
考虑构造个例 \(M _1\),使得 \(\lang M _1\rang\in L _P\),显然 \(M _1\) 接受的输入都满足 \(P\)
那么考虑令 \(M'\) 在输入 \(x\) 上,以 \(w\in L(M)\) 为条件运行 \(M _1(x)\),若 \(M _1\) 接受则接受,具体为两步过程:先模拟 \(M\)\(w\) 上运行,若接受则模拟 \(M _1\)\(x\) 上运行,若接受则接受;其他情况拒绝或者不停机
当然,还有个大前提是判定的是 \([\lang M, w\rang\in L _{ACC}]\),如果输入不是 \(\lang M, w\rang\) 的合法形式呢?当然这时我们也绝不能让 \(f(\cdot)\in L _P\),不妨假设 \(L _P\) 不包含空语言 \(\empty\notin L _P\)(否则令 \(P\larr \overline{P}\),依然是非平凡性质),然后让此时 \(f(\cdot)=\lang M _\empty\rang\),其中 \(L(M _\empty)=\empty\) 即可

综上,我们构造的 \(f(\cdot)\) 如下:

  1. \(\cdot\) 不是 \(\lang M, w\rang\) 的合法形式,则 \(f(x)=\lang M _\empty\rang\)
  2. \(\cdot\) 形如 \(\lang M, w\rang\),则 \(f(x)=\lang M'\rang\),其中:\(M'\) 对于输入 \(x\),先模拟 \(M\)\(w\) 上运行,若接受则模拟 \(M _1\)\(x\) 上运行,若接受则接受;其他情况则拒绝或者不停机

于是 \(\cdot\in L _{ACC}\lrArr f(\cdot)\lrArr L _{P}\)\(L _{ACC}\le _m L _P\),得证

给一些课后习题:

Exercise. 证明 \(L _R = \{\lang M\rang:L(M) = (L(M)) ^R\}\) 不可识别

这个我们之前证明过,这里利用规约再证一次(当然,用 Rise 更轻松):
可证明 \(\overline{L _{ACC}}\le _m L _{R}\),则 \(L _{ACC}\le _m \overline{L _R}\)
对于 \(\lang M, w\rang\),构造图灵机 \(M'\),对于输入 \(x\),先判定是否为 \(01\),不是则拒绝,若是则模拟 \(M\)\(w\) 上运行,若接受则接受,否则拒绝;则:
\(w\in L(M)\lrArr \lang M, w\rang\in L _{ACC}\lrArr L(M')=\{01\} \lrArr\lang M'\rang\in \overline{L _R}\)
\(f:\lang M, w\rang\mapsto\lang M'\rang\) 是映射规约,从而 \(L _{ACC}\le _m \overline{L _R}\),得证

Exercise. \(L _{stop} = \{\lang M\rang:M在所有输入上均停机\}\)
(1) 利用 Rice 定理证明 \(L _{stop}\) 不可判定;
(2) 证明 \(L _{stop}\) 非递归可枚举(提示:利用归约技术);
(3) 证明 \(\overline{L _{stop}}\) 非递归可枚举(提示:利用归约技术)。

(1) \(M _1\) 仅有起始节点且无转移,则 \(M _1\) 必定停机;\(M _2\) 仅有起始节点且有每个符号到自己的转移,没有接受节点,则 \(M _2\) 必定不停机。则 “在所有输入上均停机” 是图灵机识别语言非平凡性质,得证
(2) 可证明 \(\overline{L _{ACC}}\le _m L _{stop}\),则 \(L _{ACC}\le _m \overline{L _{stop}}\)。对于 \(\lang M, w\rang\),构造图灵机 \(M'\),对于输入 \(x\),模拟 \(M\)\(w\) 上运行,若接受则运行 \(M _2\),否则停机。则
\(w\in L(M)\lrArr \lang M, w\rang\in L _{ACC}\lrArr\lang M'\rang\in \overline{L _{stop}}\)
\(f:\lang M, w\rang\mapsto\lang M'\rang\) 是映射规约,从而 \(L _{ACC}\le _m \overline{L _{stop}}\),得证
(3) 同 (2),令 \(M'\) 为:对于输入 \(x\),模拟 \(M\)\(w\) 上运行,若接受则停机,否则运行 \(M _2\)

其他问题

后面就是一些其他问题了

Def. 波斯特对应问题(Post correspondence problem)
给定两个序列

\[\begin{aligned} A &= (\alpha _1, \alpha _2, \dotsb, \alpha _k) \sube \Sigma ^ * \\ B &= (\beta _1, \beta _2, \dotsb, \beta _k)\sube \Sigma ^ * \end{aligned} \]

询问是否存在有限下标序列 \((i _1,\dotsb, i _m)\),使得 \(\alpha _{i _1}\alpha _{i _2}\dotsb \alpha _{i _m} = \beta _{i _1}\beta _{i _2}\dotsb \beta _{i _m}\)

Th. 波斯特对应问题 \(PCP\) 是不可判定的。

证明为建立一个修改后的波斯特问题 \(MPCP\),然后证明 \(L _{ACC}\le _m MPCP\le _m PCP\),还差两天考试了在此省略

Th. 文法相关问题
如下问题都是不可判定的:

  • 给定文法 \(G\),是否 \(\epsilon\in L(G)\)
  • 给定文法 \(G\) 和字符串 \(w\),是否 \(w\in L(G)\)
  • 给定文法 \(G\),是否 \(L(G)=\empty\)
  • 给定文法 \(G _1\)\(G _2\),是否 \(L(G _1) = L(G _2)\)
  • 给定字符串 \(w\),是否存在一个特定的文法 \(G _0\) 使得 \(w\in L(G _0)\)

Th. 上下文无关文法相关问题
如下问题都是可判定的:

  • 给定上下文无关文法 \(G\),是否 \(\epsilon\in L(G)\)
  • 给定上下文无关文法 \(G\) 和字符串 \(w\),是否 \(w\in L(G)\)
  • 给定上下文无关文法 \(G\),是否 \(L(G)=\empty\)

如下问题都是不可判定的:

  • 给定上下文无关文法 \(G\),是否 \(L _G=\Sigma ^ *\)
  • 给定上下文无关文法 \(G _1\)\(G _2\),是否 \(L(G _1) = L(G _2)\)
  • 给定下推自动机 \(M _1\)\(M _2\),是否接受相同语言
  • 给定下推自动机 \(M\),计算一个等价的下推自动机 \(M'\),使得 \(M'\) 的状态最少