自动姬会说正则语言吗

\[\newcommand{\d}{\mathrm d} \newcommand{\N}{\mathbb N} \newcommand{\sube}{\subseteq} \newcommand{\sub}{\subset} \newcommand{\supe}{\supseteq} \newcommand{\sup}{\supset} \newcommand{\eps}{\epsilon} \newcommand{\vare}{\varepsilon} \newcommand{\cur}[1]{\left\{#1\right\}} \newcommand{\ip}[1]{\left<#1\right>} \newcommand{\getsto}{\leftrightarrow} \newcommand{\t}{\text} \newcommand{\c}{\mathcal} \newcommand{\vd}{\vdash} \newcommand{\ovl}{\overline} \newcommand{\To}{\Rightarrow} \newcommand{\Gets}{\Leftarrow} \newcommand{\GetsTo}{\Leftrightarrow} \]

O. 绪论

算法的输入是什么?计算理论只考虑输入输出均为自然数的函数。但是,有很多非自然数信息都可以用自然数编码。例如,我们可以接受字符串作为输入。

字符串定义在大小有限的 字符集 (alphabet) 上。特别地,空串被记作 \(\vare\)。通过字典序编码,字符串集合可以和自然数集合一一对应。

两个集合 等势 (of same cardinality),如果其间存在双射关系。可数集:可以用自然数标号,即存在到自然数的单射的集合。

有理数是可数的。\(k\)-元自然数组(长度有界,字符集可数无穷)是可数的。字符串集(长度无界,字符集有限)是可数的。那长度有限但无界、字符集可数无穷,即全体有限长自然数列集合呢?

其同样可数。Gödel 标号:令 \(\cur{p_i}\) 为全体质数集合,则 \((x_1,\dots,x_n)\mapsto p_1^{x_1}p_2^{x_2}\dots p_n^{x_n}\),易知此乃双射。

但是,无限长度数列,就算其字符集是有限的,也仍然不可数。这样的数列其实就是实数,而实数集不可数。

我们敬爱你呵,wxf!所有实数排成一列。令一个实数,其在小数点后第一位上不等于第一个实数,第二位上不等于第二个实数……则其不等于全体实数。

这是一个被称作 对角化 (Diagonalization) 的有趣技巧。如果要证明两个集合 \(A,B\) 不等势,该技巧的形式化描述为:

目标设为证明不存在满射 \(f:A\to B\),即对于固定的 \(f\) 寻找 \(d\in B\) 满足任何 \(a\in A\) 都有 \(f(a)\neq d\)

证明方式是为 \(d\) 建构出许多个侧面,每个侧面由某个 \(a\)\(f(a)\) 决定:令该侧面不等于 \(f(a)\)

于是 \(d\) 即不等于一切 \(f(a)\)

只有可数个实数 能被人类所理解。例如,

\[\sqrt2,\arcsin(2/23),\int_0^1x^x\d x \]

这些东西都是可以被理解的实数。“可以被理解”等效于“存在描述其的字符串”。

I. 正则语言

形式语言 (formal language):有字符表 (alphabet) Σ。有字符串 (string)。任意长度的串(包括空串)构成 Σ*。语言 (language) 是 Σ* 的子集。

例如,当字符集 \(\Sigma=\cur{x,y,z,\land,\lor,\lnot,(,)}\) 时,可以令 L0 是全体语法正确的串。L1 是全体重言式。易知,有 \(L_1\sube L_0\)

程序 (program) 或 机器 (machine) \(M\) 接受字符串作为输入并输出 accept 或 reject。\(M\) 对应的语言 (language recognized by \(M\)) \(L(M)\)\(M\) 接受的全体串集合。

1 bit 就已经够简化了。多 bit 的场合可以看作多个机器的共存。

有限自动机 (finite automata):确定的有限个态。起始态和任意个(包括零个)终止态。输入是符号序列。一次读一个符号。转移方程 \(\delta\)

有限自动机总会停机,其运行时间等同于序列长度。

语法学 (syntax):自动姬的结构(研究状态与转移函数)

语义学 (semantics):自动姬的功能(接受什么串作为输入)

DFA:\((Q,\Sigma,\delta,q,F)\)。一个机器 \(M\) 是否接受一个串 \(w\) 可以用 wf. 描述:\(\exists(r_0,\dots,r_n)\) 满足 \(r_0=q,r_i=\delta(r_{i-1},w_i),r_n\in F\)

DFA 的作用:简单模式识别;有限值域算数(背包/模意义代数等)

正则语言 (regular language):能被某个 DFA 识别的语言。

从已知的自动姬出发可以构建新自动姬。这也可以被翻译为语言集合上的操作。比如说,\(L(M)\) 的补集 \(\ovl{L(M)}\) 可以通过将终止态集合取反得到。于是正则语言集合关于补集封闭。

同理,两个自动姬作 Cartesian 积对应语言集合的求交。使用 De Morgan 律 \(X\cup Y=\ovl{\bar X\cap\bar Y}\) 可以由交补两个操作表示出逆。

还有其它语言集合的操作。例如,拼接 (concatenation) 操作 \(A\circ B=\cur{x+y\mid x\in A,y\in B}\)Kleene 星号/Kleene 闭包 (Kleene star) 操作 \(A^*=\cur{x_1+\dots+x_k\mid k\geq 0,x_i\in A}\),即 匹配零次或多次。易知空串 \(\vare\in A^*\)

Kleene 星号是很泛用的一个记号。它的适用范围可以被扩充为一切集合间的 Cartasian 积。

拼接操作似乎有些困难。


NFA,参上!

具体而言,令 \(2^A\) 是集合 \(A\) 上的 幂集 (power set),即全体子集构成的集合。转移方程 \(\delta:Q\times\Sigma_\vare\to2^Q\)。即,NFA 允许从同一个态接受同一个字符走到不同的后继态,也可以从同一个态不接受任何字符(使用 \(\vare\))走到后继态。

定理:一切 NFA \(N\) 都存在一个与之识别相同语言的 DFA \(M\)。只需要让 \(M\) 的状态集为 \(N\) 上的幂集即可(状压 DP)。因此,\(Q\) 个状态的 NFA 需要一个 \(2^Q\) 个状态的 DFA。但是指数级别的 DFA 真的是有必要的吗?

确有必要。考虑这样一个语言:LK 识别从后往前数第 \(k\) 个字符是 \(b\) 的串。则易建立一个 \(k+1\) 态的 NFA 识别它(\(\cur{a,b}^*\to b\to\cur{a,b}^k\))。

现在假设存在一个 \(2^k-1\) 态的 DFA 识别它。则运行全体 \(\cur{a,b}^k\),必然存在两个 \(w\neq w'\) 停止于同一个终态。

\(j+1\) 是从前往后数第一个 \(w,w'\) 不同的位置。则考虑 \(w+a^j\)\(w'+a^j\) 两个串:因为 \(w,w'\) 终态相同,所以这两个串终态也相同;但是这两个串的倒数第 \(k\) 位恰好是那个不同的位置,因此二者应该被该 DFA 区分,不可能停止于相同终态。出现矛盾,DFA 至少需要 \(2^k\) 态!

从初态连两个 \(\vare\)\(N,M\) 的初态即得 \(L(N)\cup L(M)\);从 \(N\) 的所有终态连 \(\vare\)\(M\) 的初态即得 \(L(N)\circ L(M)\);从 \(N\) 的所有终态连 \(\vare\) 到初态,并把 初态标记为终态 不能直接把初态标记为终态,因为有可能不小心漫游到初态;应该新建立一个标记为终态的初态并连 \(\vare\) 到原初态,所有终态改为连向新初态 即得 \(L(N)^*\)


Review:正则语言是能被 NFA/DFA 确定的语言。正则操作 (regular operation) 是 union、concatenation、star。正则表达式 (regular expression, REGEXP) 是由正则操作递归得到的字符串集合。简化符号省略拼接的 \(\circ\) 符号,并且认为优先级是 \({}^*>\circ>\cup\),同时支持 \(\cur{A=a_1,\dots,a_n}\) 表示 \(\bigcup_{a_i\in A}a_i\) 的记法。

一切 REGEXP 表达的语言,都可以被 NFA 识别。但是反过来成立吗?

首先先定义一个 广义 NFA (Generalized NFA, GNFA) 的概念:态 \(q_i\) 在读取任意 \(\delta(q_i,q_j)\) 表达的串后,会转移至态 \(q_j\)。其中,\(\delta(q_i,q_j)\) 可以是一个 REGEXP。GNFA 由五元组 \((Q,\Sigma,\delta,q_\t{start},q_\t{accept})\) 组成。

可以看到,GNFA 要求唯一的起始态 \(q_\t{start}\) 和唯一(而非一个集合)的终止态 \(q_\t{accept}\)。并且,GNFA 的 \(\delta:(Q\setminus\cur{q_\t{accept}})(Q\setminus\cur{q_\t{start}})\to\t{REGEXP}\),可以看到这要求起始态没有入边、终止态没有出边。

通过建立新起点新终点规避起讫态的不当出入边,NFA 简单转成 GNFA(NFA 的边权属于 Σε,因此直接是 REGEXP)。GNFA 转成 NFA 只需要把 REGEXP 转成 NFA 即可。因此,可知 NFA 与 GNFA 是等价的。

GNFA 的一个优良性质是,因为 REGEXP 作为边权时记录了大量信息,所以可以尝试压缩态。事实上,一个 \(k>2\) 态的 GNFA 总是可以被压缩为一个 \(k-1\) 态的 GNFA。

具体而言,假设我们要扔掉一个 \(q_\t{rip}\) 态,则对于另外的两个态 \(q_i,q_j\)\(q_i\) 转移到 \(q_j\) 可以直接走也可以从 \(q_\t{rip}\) 走,于是定义

\[\delta'(q_i,q_j)=\delta(q_i,q_j)\cup \\(\delta(q_i,q_\t{rip})\circ\delta(q_\t{rip},q_\t{rip})^*\circ\delta(q_\t{rip},q_j)) \]

这样就把 \(q_\t{rip}\) 的态扔掉了。不断进行这个操作,可以将一个任意态的 GNFA 变成一个仅有两态的 GNFA;而这个两态 GNFA 就是一个 REGEXP。

通过 NFA->GNFA->\(2\)-GNFA-REGEXP 的过程,我们成功证明了 NFA 可以被 REGEXP 表示。因此综上,NFA、DFA、REGEXP 是三种等效的描述方案。


当然,存在超越上述三方案的语言,即 非正则语言 (non-regular language)。例如,\(B=\cur{0^n1^n\mid n\in\N}\) 就是一个非正则语言。

假如存在一个 \(k\) 态 DFA \(M\),则由抽屉原理存在 \(0\leq i\neq j\leq k\) 满足 \(0^i,0^j\) 终止于同一个态。因此如果 \(M\) 接受 \(0^i1^i\),则其必然接受 \(0^i1^j\)

正则语言判定有相关的 泵引理 (pumping lemma):如果 \(A\) 是正则语言,则存在一个数 \(p\)(称作 泵长度 (pumping length))满足 \(A\) 所有中长度至少为 \(p\) 的串 \(s\) 都可以被拆分成 \(s=xyz\),其中:

  • 对于一切 \(i\geq0\),有 \(xy^iz\in A\)
  • \(|y|>0\)
  • \(|xy|\leq p\)

\(p\) 为 DFA 大小。令 \(q_0=q_\t{start},q_i=\delta(q_{i-1},s_i)\)。则仍由抽屉 \(q_{0\sim p}\) 中存在重复态 \(q_i,q_j\),则 \(s_{[i+1,j]}\) 的效果是 \(q_i=q_j\) 处的子环,这一段即可成为 \(y\) 来不断绕圈。

因为 \(y\) 可以不断重复,所以也有 反复引理 的译法。泵引理涌出引理 是直译。

使用泵引理证明非正则性常常假设一个 \(p\),然后根据 \(p\) 定义一个确定的 \(s\),然后通过否决 \(s_{1\sim p}\) 的全体分割方案以证明。

但是注意:正则语言必然满足泵引理,然而非正则语言也有满足的。这正如 Fermat 小定理只能用来证伪质数一样,泵引理只能证明一个语言非正则。

真正的充要条件是 Myhill-Nerode 定理:对于语言 \(L\) 和两个串 \(x,y\),称二者(关于 \(L\) 的)区分性扩张 (distinguishing extension) 是串 \(z\) 满足 \(xz\)\(yz\) 只有一者属于 \(L\)。称二者关于 \(L\) 不可区分,如果不存在区分性扩张,记作 \(x\sim_L y\)。则不可区分性是等价关系,且将全集划分为等价类。

则 M-N 定理声称,一个语言是正则的,当且仅当其关于 \(\sim_L\) 构成有限个等价类,且该数目等于接受其的 DFA 的极小态数。


DFA 有很多。但是我们显然不希望 DFA 的态数很多。

首先一个朴素的想法是,对于 DFA \(M\),定义 \(M_p\) 为其它条件均相同,唯独起始态变成 \(p\) 后的 DFA。两个态 \(p,q\)可区分 (distinguishable) 的,如果存在串 \(s\) 满足其被 \(M_p,M_q\) 某一者接受但不被另一者接受;反之即为 不可区分 (indistinguishable) 的。

为方便,定义 \(M(w)\) 为判定 \(M\) 是否接受 \(w\) 的 bool 函数。则上式亦可写作 \(M_p(s)\neq M_q(s)\)

不可区分性构成等价类,因此不可区分对会为 DFA 产生 冗余 (redundant):把不可区分类缩点即可减少 DFA 的态数。

除了不可区分性之外,还存在某些态压根没法从初态可达,这些态也应该被考虑。设计一个同时达到二者的算法 (Myhill-Nerode 算法) :

考虑 \(M=(Q,\Sigma,\delta,q_0,F)\)

  1. \(q_0\) 出发搜索,删去所有不可达态。
  2. 如果 \(p\in F\)\(q\notin F\),则 \((p,q)\) 显然是可区分的(一个接受空串,另一个不接受),标记这个对。
  3. 对于对 \((p,q)\)\(a\in\Sigma\),如果 \((\delta(p,a),\delta(q,a))\) 被标记为可区分,则 \((p,q)\) 亦然。重复这一操作,直到不再有新增对。
  4. 未被标记的对即为不可区分对。

为何该算法求出的即为最小 DFA?首先因为所有态均可达,所以对于态 \(q_i\) 存在态 \(w_i\) 到达之。如果存在更少态 DFA \(N\),则抽屉知存在 \(w_i,w_j\) 到达同一态 \(q\)。则对于一切串 \(s\),都有 \(N(w_is)=N(w_js)\),于是 \(M_{q_i},M_{q_j}\) 不可区分,违背算法终止条件(不存在不可区分对),因此不存在这样的 \(N\)

更进一步地,所有最小 DFA 都会与上述算法求出的 \(M\) 同构。

II. 上下文无关语法

上下文无关语法 (Context Free Grammar, CFG) 是四元组 \((V,\Sigma,R,S)\)

  • \(V\) 是变量 (variable) 集合,是 CFG 中的非终止态。
  • \(\Sigma\) 是终态 (terminal) 集合,是 CFG 中的终止态。
  • \(R\) 是转化规则,将变量映到 \((V\cup\Sigma)^*\) 的字符串。
  • \(S\) 是起始变量 (start variable)。

它的法则是不断把变量应用规则进行转化,即 \(uAv\To uwv\),其中 \(A\to w\) 须是 \(R\) 中的规则。称 \(u\) 生成 (derives) \(v\),如果存在 \(u\To u_1\To\dots\To u_k\To v\) 的转化链,此时记作 \(u\To^*v\)

一个 CFG \(G=(V,\Sigma,R,S)\) 对应的语言 \(L(G)=\cur{w\in\Sigma^*\mid S\To^*w}\)。易知:REGEXP 是一种特殊的 CFG。

CFG 比 REGEXP(以及相应的 DFA、NFA)强,例如前述 \(\cur{0^n1^n}\) 语言无法被 REGEXP 表出但是可以被 CFG 表出:\(S\To0S1\cup\vare\)。DFA 也可以直接一步到 CFG:对于 \(\delta(q_i,a)=q_j\) 添加法则 \(q_i\To aq_j\)、对于终态 \(q\) 添加法则 \(q\To\vare\) 即可。

对于 CFG 生成的一个串可以简单画出其 语义树 (parse tree),叶节点是终态、非叶节点是变量。

一个 CFG 具有 二义性 (ambiguous) 如果存在一个串可以画出不止一种语义树。例如,EXPR->a or b or c,EXPR->EXPR + or - or * or / EXPR 的法则会让 a+b*c 的串有先展开 + 和先展开 * 的两种策略。注意,不同的生成序列有可能对应相同的语义树:它们可能以不同顺序搜索整棵语义树。通过强制安插括号,可以让二义的 CFG 变成非二义的。

当然,也可以使用 波兰序 (Polish Notation),即前序表达式。解码只需要每次寻找最右侧的符号,则该符号管辖的范围是确定的。


自然语言是二义的——虽然显然不能指望用 CFG 描述自然语言。然而,检查 CFG 是否是二义的这件事本身是不可决定的。

一个 CFL (context free language,是 CFG 确定的语言) 被称为 先天二义 (inheretely ambiguous) 的,如果所有生成其的 CFG 均是二义的。


CFL 在 union、concatenation 和 Kleene star 意义下是封闭的。然而,其关于 intersection 却并非封闭;CFL 只有在关于 regular 的 CFL 求交时才是封闭的。


与 CFG 相对的是 上下文相关语法 (Context Sensitive Language, CSG)。判定一个串是否属于 CSG 是 PSPACE-complete 的。判定 CSG 是否非空是 undecidable 的。


正则表达式是从语法方面描述正则语言。DFA 和 NFA 则是从计算方面。

现在,CFG 是语法方面对 CFL 的描述,那与 DFA/NFA 对应的概念是什么?

下推自动机 (pushdown automaton) 是 DFA/NFA 的扩展。其可以访问一个栈,从栈顶 push/pop 元素。每一步考虑当前态、输入信息和栈顶信息三个量,转移至新态并压入新元素。

形式地说,其是六元组 \((Q,\Sigma,\Gamma,\delta,q_0,F)\)。其它东西都很熟悉了,这里着重介绍几个概念:

  • \(\Gamma\) 是栈字母表。\(\delta:Q\times\Sigma_\vare\times\Gamma_\vare\to2^{Q\times\Gamma_\vare}\),即接受当前态、输入信息、栈顶 pop 信息三维,给出后继态和栈顶 push 元素。
  • \(F\sube Q\) 是终止态。特别地,存在另一种定义方式是,一个串被接受当且仅当跑完后栈空了。

上述描述其实是 非确定性下推自动机 (Non-deterministic PushDown Automaton, NDPA)。存在 确定性下推自动机 (Deterministic PushDown Automaton, DPDA) 的概念,但是因为二者不等价,且只有前者与 CFG 等价,因此此处我们只考虑 NDPA 的概念,并直接称呼其为 PDA。

PDA 接受一个 \(w\in\Sigma^*\) 当且仅当如果 \(w=x_1\dots x_m\)(其中每个 \(x_i\in\Sigma_\vare\)),此时定义相应的 \(r_0,\dots,r_m\in Q\) 为状态序列,\(s_0,\dots,s_m\in\Gamma^*\) 为栈序列,则:

  • \(r_0=q,s_0=\vare\)
  • \((r_i,b)\in\delta(r_{i-1},x_i,a)\),其中 \(s_{i-1}=at\)\(s_i=bt\)
  • \(r_m\in F\)

注意,这里 \(a\) 其实有两种选择,可弹可不弹。不同的抉择引来不同的 \((r_i,b)\) 的后继。

一个自 \(q_i\)\(q_j\) 的转移可以用三元组 \(a,b/c\) 描述:\(a\in\Sigma_\vare\) 表示读入字符,\(b,c\in\Gamma_\vare\) 表示出栈/入栈元素。按照传统,PDA 的起始态会通过操作 \(\vare,\vare/\$\) 来加入一个象征“栈底”的符号 \(\$\),而在终止态会通过 \(\vare,\$/\vare\) 把栈排空。在画自动姬 DAG 图时,也可以通过在态间转移边上标注 \(a,b/c\) 三元组来刻画转移。

例如,PDA 可以描述全体(偶)回文串:态 \(q_1\) 出发自环 \(0,\vare/0\)\(1,\vare/1\),态 \(q_2\) 出发自环 \(0,0/\vare\)\(1,1/\vare\),中间用 \(\vare,\vare/\vare\) 连接即可描述。这里体现开始时强制 push 一个 \(\$\)、结尾时强制 pop 一个 \(\$\) 的功效:二者共同保证栈最终被清空。

特别地,三元组 \(a,b/c\) 中的 \(c\) 也可以是字符串 \(c_1\dots c_n\),此时表示单独 pop 一个 \(b\) 后连续 push 一堆东西。这其实可以被看做一个 \(a,b/\vare\) 和一堆 \(\vare,\vare/c_i\) 的结合。

PDA 可以被用于描述 CFG。我们希望找到一种合适的转化方式,使得如果 PDA 以空栈结束,则其即对应 CFG 的一种生成方式;反之,如果 CFG 无法生成任何合法方案,则 PDA 要么到某个死胡同态就停滞不前,要么到终止态但栈未被清空。

PDA 通过描述一个在语义树上搜索的过程来判定一个串是否位于 CFG 中。令 PDA 的栈字母表 \(\Gamma\) 为 CFG 的全体变量与终态,然后时刻在栈中维护语义树的一部分。每次选取栈顶元素,检查:

  • 如果其是变量,则将其弹出并压入变量的某种转化方式。对于转化方式 \(A\to\alpha\),建立自环 \(\vare,A/\alpha_1\dots\alpha_n\)
  • 如果其是终态,则输入一个待判定串的下一个字符,只有其与该终态吻合才能继续。对于终态 \(a\),建立自环 \(a,a/\vare\)
  • 通过 \(\$\) 来限制结束时必须空栈。

可以发现,这个 PDA 的态数只需要常数规模,转移数目与 CFG 的规则数目相符。

反过来,我们希望用 CFG 模拟 PDA。此时寻求一种简化的 PDA,其中:

  • 起讫态 \(q_\t{start},q_\t{accept}\) 均唯一。
  • 在到达终止态前,栈必然被清空。
  • 每个转移或者弹栈或者压栈,不会同时进行。

现在,对于任两个 PDA 态 \(p,q\),定义一个 CFG 变量 \(A_{pq}\)。初始从 \(A_\t{start,accept}\) 出发,目标是 \(A_{pq}\) 会转移到 \(p\to q\) 的一条路径。构建如下几种转移:

  • 枚举中继态 \(p',q'\),希望在 \(p\to p'\) 时入栈一个栈字母 \(t\),并在 \(q'\to q\) 时出栈。如果存在 \(p\to p'\) 的转移 \(a,\vare/t\)\(q'\to q\) 的转移 \(b,t/\vare\),则添加规则 \(A_{pq}\to aA_{p'q'}b\)
  • 也可以不涉及出入栈操作,直接枚举中继 \(r\) 然后使用规则 \(A_{pq}\to A_{pr}A_{rq}\)
  • \(A_{pp}\to\vare\)

虽然 PDA 与 CFG 等价,但鉴于 NPDA 的非确定性,它只能止于理论。实际应用时,更多地是将 CFG 转成如下的:

Chomsky 范式 (Chomsky Normal Form, CNF。注意与 2-CNF 中的 CNF 区别,后者是合取范式 Conjunctive Normal Form 的简称) 是一种最简单的 CFG 亚种。其转化方式只有从一个变量到两个变量,或者从一个变量到一个终态。特别地,转化而来的两个变量不被允许是起始变量,并且自起始变量至空串的转移总是被允许。

任意 CFG 都能被简单转化为 CNF。


Cocke-Younger-Kasami 算法验证串是否属于 CNF 形式的 CFG:简单区间 DP。时间复杂度 \(O(n^3|G|)\),其中 \(G\) 是 CFG 大小。存在 \(O(n^\omega|G|)\) 的优化。


CFL 也存在泵引理。对于一切 CFL \(A\),存在泵长度 \(p\) 满足对于 \(A\) 中一切长度至少为 \(p\) 的串 \(s\),其均可被切分为五段 \(s=uvxyz\),并且:

  • 对于一切 \(i\geq0\),都有 \(uv^ixy^iz\in A\)
  • \(|vy|>0\)
  • \(|vxy|\leq p\)

这是因为,对于一个 足够 大的语义树,其中总会出现两个相同变量 \(N\),且一个在另一个的子树内。此时介于两者之间的部分即可当作泵 \((v,y)\) 对。

要想使用抽屉原理确定足够大的 \(p\),一个充分足够的界是 \(p=b^v+1\),其中 \(v\) 是变量数目,\(b\) 是 CFG 转化规则中一个变量可以转化为的最多符号数目。

例如,\(\cur{a^nb^nc^n\mid n\geq0}\) 就不是 CFG。

通过 CFG 的泵引理,可以发现 CFG 关于交并不封闭。

III. Church-Turing 论题

正则语言是可以用正则表达式、确定性或非确定性有限状态自动机描述的语言。

上下文无关语言是正则语言的扩展,可以用上下文无关语法或下推自动机描述。

Turing 机则是进一步的扩展,可以识别几乎一切可想的语言。但是如 Turing 停机问题仍是不可识别的。

存在比 Turing 机更强的模型吗?


首先先列一下 Turing 机的形式描述:

七元组 \((Q,\Sigma,\Gamma,\delta,q_\t{start},q_\t{accept},q_\t{reject})\)

  • \(Q\):自动姬状态集合。
  • \(\Sigma\):输入字符集,不包含占位符 \(\perp\)
  • \(\Gamma\):纸带字符集。须保证 \(\Sigma\cup\cur{\perp}\sube\Gamma\),因为初始输入串 \(s\) 会被预存储于前 \(|s|\) 格,且其它位置均为占位符 \(\perp\)
  • \(\delta:Q\times\Gamma\to Q\times\Gamma\times\cur{L,R}\)
  • \(q_\t{start},q_\t{accept},q_\t{reject}\in Q\),且后两者不等。

Turing 机的纸带是单向无限的。如果在最左侧试图左移会怎样?自动姬上的状态仍会演化,但是指针仍留在原地 (stay put)。

Turing 机的转移方程也可以如 PDA 一样写在自动姬的转移边上。\(b_1\to b_2,(L/R)\) 的意思是,当读取 \(b_1\in\cur{0,1}\) 时,写入 \(b_2\in\cur{0,1}\) 并左移/右移。

一个 格局 (configuration) 包含纸带内容、指针位置和状态。可以使用 \(uqv\) 的形式描述一个指针前为 \(u\)、指针状态为 \(q\)、指针后为 \(v\) 的态。特别地,因为 Turing 机单项无限,所以如果在 \(uq\) 的“右端点”态尝试右移,会在后面补充一个 \(\perp\) 并视作 \(uq\perp\) 在右移(反之,如果在左端点左移则 stay put)。

停机格局 (halting configuration) 是指针状态为接受态或拒绝态之一的格局。

Turing 机确定了所有能到达接受态的串构成的语言。到达拒绝态或不停机的串均不属于语言。Turing 机 识别 (recognize) 一个语言如果 \(L(M)=A\)判定 (decide) 一个语言如果在这基础上所有不属于该语言的串都停机了。

一个语言是 递归可枚举 (recursively enumerable) 的,如果存在识别它的 Turing 机;是 递归 (recursive) 的,如果存在决定它的 Turing 机。

因此,递归可枚举等价于 可识别 (recognizable);递归等价于 可判定 (decidable);并称一个语言是 共可识别 (co-recognizable)——这翻译真挫——的,如果它的补集是可识别的。

显然一个语言是可判定的,当且仅当其是可识别且共可识别的。


TM 是一个优秀的理论模型。但是它绝非一个好的编程语言!其价值在于其理论地位。

Church-Turing 假说人类可用纸笔计算出 的自然数,当且仅当它是 Turing 机可计算的自然数。


Turing 机变种:

  • 多带。
  • 非确定性转移(如 DFA 和 NFA 之区别)。
  • 给出自然数而非单一 bit 的输出。

但是它们的计算能力均相同!

例如,一个 \(K\) 带 Turing 机 (\(K\)-tape Turing machine) 在每个纸带上分别有一个指针,转移综合 \(K\) 个指针指向的信息得出结果,然后对每个指针给出左移/右移/停在原地 (stay put) 的指令。

\(K\) 带 Turing 机与朴素 Turing 机等价。可以把 \(K\) 条纸带上的所有非 \(\perp\) 信息首尾相接放到同一条纸带上,中间用特殊未出现字符 定界符 (delimiter) \(\#\) 分割;每个纸带上指针位置上的字符 \(\sigma\) 用其一个未出现的对应变体 \(\bar\sigma\) 标记,然后不断用一个指针扫来扫去记录全体特殊位置的信息并更新特殊位置即可。如果特殊位置尝试移动至 \(\#\),则要把 \(\#\) 及其之后的所有字符统统右移一位(虽然这看上去毫无效率,但你都用 Turing 机了还在意效率干嘛呢)。

非确定性 Turing 机 (non-deterministic Turing machine, NTM) 对于一个输入,给出数种不同的后继状态、写入字符和左右移方式。同理,NTM 接受一个串当且仅当存在一种到达接受态的路径。NTM 判定 (decide) 某个语言如果所有输入在所有决策下均终将停机,此时 NTM 是 判定器 (decider)。

NTM 可以用一个 \(3\)-TM 模拟:第一带是锁定而不再修改的输入;第二带是模拟带;第三带记录在 NTM 决策树上的一次搜索。整体是一个宽搜的过程:每次依照第三带上的决策信息,将第一带上的初态拷贝到第二带上然后在其上依据决策模拟,如果存在不合法决策(第三带上的每一个数的值域都需要枚举到所有转移中后继态数目的最大值,自然有时会对应不合法决策)或是模拟失败则将第三带上的决策信息调整为字典序加一的结果。

其实我觉得更像是迭代加深 dfs。

为什么使用这种做法而非 dfs?因为 dfs 很容易就陷入无限深的错误路径上。

正如 NFA-DFA 的指数级别关系一样,NTM-DTM 的模拟也有一个指数级别的关系。不同的是,这个指数关系是否是必要的目前还止于猜想,就是经典的 P vs NP。


现在我们保证如果 NTM 接受一个输入,则对应的 \(3\)-TM 也接受它;但是我们如何保证如果 NTM 拒绝一个输入,则对应的 \(3\)-TM 也拒绝(而非不停机),这样 NTM 和 TM 就可以同时判定一个语言了?

答案是,如果某个长度的全体输入均已停机,则 \(3\)-TM 直接停机即可。因为 NTM 拒绝,所以必然存在一个足够长的长度。


Turing 机可以有输出。即,有一个 只写 (write-only) 的纸带,其中的指针只能右向移动,即一个打字机。

可输出 Turing 机可以当一个 枚举器 (enumerator),它可以一个个枚举需要的串,并且 允许重复,且其不停机。这也是 Turing-recognizable 语言也被称作递归可枚举的原因之一:一个语言是 Turing-recognizable 的,当且仅当存在一个生成其的枚举器。

假如有 enumerator,则不断让其枚举并让输出与待判定串比较即可。如果其属于该集合,则其终将停机。

反之,如果存在 recognizer,则枚举全体串并判定……不可以!因为不被 accept 的串不一定停机!只能使用迭代加深的方法,枚举阈值 \(n\),然后枚举前 \(n\) 个串并执行其判定的前 \(n\) 步。这样虽然多做了许多无用功,但是至少确保合法性。


Turing 机有许多等价变体。此外,还有其它非基于 Turing 机的通用计算模型(例如 Recursive Function 等)。

然而,只要模型满足 Turing 机的本质特征「无限制地访问无限的存储器」,以及如「一步只能执行有限工作量」等非本质但必要的特征,其即与 Turing 机等价。

例如 Hilbert 第十问题:整系数多项式 Diophantine 方程的整数解,这个问题在算法上是不可解的。

具体而言,其要求我们证明:全体有整数根的整数多项式构成的集合 \(D\) 是可判定的。首先其是可识别的:Turing 机可以无限地枚举所有根,但是其显然只能作为一个识别器。

在一元多项式的场合,依据项数和系数值域,可以确定一个根的上界,因此全体一元 Diophantine 多项式的集合是可判定的;但是,由 Matijasevic 定理,多元多项式的场合,这个上界不存在,不能依托输入信息估计出根的上界,因而 Hilbert 第十问题即不可解了。

IV. 可判定性

Turing 机可以用自然数编码,因此所有 Turing 机集合是可数的。

通用 Turing 机 (universal Turing machine) 是可以模拟一切 Turing 机接受某个输入后输出的 Turing 机。其输入是 Turing 机编码及其输入的二元组。

何为模拟?接受、拒绝、不停机,三种结果在二者上均同。

UTM 可以在三带上进行,分别是 \(M\) 的结构、\(M\) 的纸带内容,以及 \(M\) 当前所处的 Turing 机状态。Alex Smith:存在一个 2-状态 3-字符的 UTM。


Gödel's Entscheidungsproblem Gödel 的判定问题 寻求一个算法,其接受某个有有限条专用公理的一阶逻辑系统和其中的一个 wf.,并判定这个 wf. 是否是永真式。由 Gödel 完备性定理,这等效于存在一个 deduction 序列。

Church-Turing:Gödel 判定问题不存在通解。


一些变种 Turing 机:

  • 初代 Turing 机:以空白稿纸开始,不会停机,除 \(\cur{0,1}\) 外还会书写其它辅助计算的字符,仅可擦除辅助字符不可擦除 \(\cur{0,1}\)
  • 打印机:只会输出 01,无法擦除。
  • 陷入循环的 Turing 机 (circular machine):书写有限个 01 后陷入循环并不再写入任何 01。如果一个 TM 未陷入循环,那它就是 无循环 circle-free 的。

circle-free TM 的意义在于其可以用于以任意精度输出一个实数。

一个 circle-free TM 输出的序列即为可计算的序列。实数是 可计算 (computable) 的,如果它的小数部分是可计算序列。因为 circle-free TM 可数,所以可计算数数目是可数无穷。

一个 可定义 (definable) 的数是可以被定义的数。因为其定义是一个串,所以可定义数数目是可数无穷。

Turing:存在一个可定义但不可计算的数。

所有可计算数排一块,定义一个数在第 \(n\) 位不等于第 \(n\) 个数。

这个是可定义的。然而我们无法枚举全体可计算数:这等价于可以枚举所有 CFTM 或是可以判定是否存在某个 CFTM 输出为某指定数。

现在假设存在一个 TM \(D\),其接受 \(N\) 当且仅当其是某个 CFTM 的输出。

使用 \(D\) 计算上述定义的数。这个算法是 \(H\):枚举全体自然数 \(N\),如果 \(D\) 接受 \(N\) 则输出 \(N\) 代表的 CFTM 的第「计数器」位的输出,并令「计数器」增加。

但是注意到 \(H\) 也是一个 CFTM。则当 \(D\) 运行到 \(H\) 时,\(H\) 会调用尚未生成的 \(H\) 的第「计数器」位的信息,进而陷入无限循环。

因此,这样的 \(D\) 必然不存在。不存在判定一个 TM 是否 CF 的 TM。

有哪些问题比 Turing 停机问题还难?

SUPERHALT:对于一个可以调用 HALTTM 为 oracle 的 TM,判定其是否停机。等价于寻找对一切输入均停机的 TM。

SUPERSUPERHALT:可以调用 SUPERHALTTM 的 TM……等价于寻找仅关于有限个输入不停机的 TM。


考虑语言 ATM:其由全体 \(\ip{M,w}\) 二元组构成,其中 TM \(M\) 接受输入 \(w\)。则 ATM 是 recognizable 的。但是,ATM 并非一个 decidable 的语言!

假设 ATMdecidable 的。设存在 decide 其的 TM \(H\):其输入 \(\ip{M,w}\) 二元组,输出 \(M\) 是否接受 \(w\)

如果 \(w\) 就是 \(M\) 的形式化描述呢?考虑建立算法 \(D\)\(D(\ip M)\) 会调用 \(H(\ip{M,\ip M})\),并给出相反的结果。

现在考虑 \(D(\ip D)\):假如这个算法给出 accept,这意味着 \(H(\ip{D,\ip D})\) 给出 reject,产生矛盾;反之亦然。

因此 ATM 必然只能是可识别但不可判定的。

既然 decidable 等效于 recognizable 且 co-recognizable,这就意味着 ATM 不是 co-regocnizable 的。因此,ATM不可识别语言。

何为 ATM?全体被拒绝或不停机的输入。

V. 可归约性

定义 HALTTM\(\ip{M,w}\) 二元组,其中 \(M\) 关于 \(w\) 停机。则如果 HALTTMdecidable 的,则 ATM 亦然。

可以先用 HALTTM 判定其是否停机,如果不停机直接 reject,否则直接跑 \(M(w)\) 即可:已经验证其必然停机。


神谕 Turing 机 (Oracle Turing Machine, OTM) 是多带 TM,并且有一个额外的询问带,特殊状态 \(q_\t{query},q_\t{yes},q_\t{no}\);一个 OTM MA 依赖于对应的 神谕语言 (oracle language) A。

在绝大多数时候,MA 和普通的 multi-TM 没有区别;除了,如果到达特殊的 \(q_\t{query}\) 态后,OTM 会自动检查询问带上的态是否属于 A;如果属于,则自动切换为 \(q_\t{yes}\) 态,否则切换为 \(q_\t{no}\) 态。

一个语言 A 被称作 Turing 可规约 (Turing reducible) 至另一个语言 B,如果存在 OTM MB 决定 A。可记作 \(A\leq_TB\)。即,假设存在一个关于 B 的神谕,则 A 就是 decidable 的了。

按照我们之前的分析,有 ATMT HALTTM。既然 ATMundecidable 的,则 HALTTM 亦然。


Kleene's s-m-n Theorem 可莉捏的涩萌娘定理(雾) :假设存在 TM \(M(x_1,\dots,x_m,y_1,\dots,y_n)\),其输入由 \(m+n\) 个变量构成。则存在 TM \(T(\ip{M},x_1,\dots,x_m)\),其接受这些信息后,输出一个 TM \(M'\),满足 \(M'(y_1,\dots,y_m)=M(x_1,\dots,x_m,y_1,\dots,y_m)\)

这很显然。

令语言 SOMETM 为全体 \(\ip M\) 满足存在一个输入被其接受。

假设 SOMETMdecidable 的,则构建算法:

  • 接受 \(\ip{M,w}\) 为输入。
  • 构建 TM \(M'\):不管输入是什么,均将 \(w\) 提供给 \(M\) 并返回相应结果。
  • \(\ip{M'}\) 提供给 decide SOMETM 的神谕,期待回报。

这个算法是 ATM 的 decider,而这是不合法的。因此,SOMETM 必然是 undecidable 的。

同理,ETM 是全体不接受任何输入的 M 的 collection。对 SOMETM 取反即可。因此也是 undecidable 的。

然而,EDFA:全体 DFA \(D\) 满足 \(L(D)\) 为空。这是一个 decidable 的语言!对于一个 \(D\),只需要大力 DP 所有可达态即可。

同理,ECFG 是全体不接受任何输入的 CFG 的 collection,则其亦是 decidable 的!可以从所有终态出发搜索全体能被逆推的 rule 即可。

但是,所有 \(M\) 满足 \(L(M)\) 是正则语言的 collection,这个语言是 undecidable 的。

构建算法:接受 \(\ip{M,w}\) 为输入。建立如下的 TM \(T\),其接受串 \(z\) 作为输入,然后其首先把 \(w\) 提供给 \(M\)

  • 如果停机了,则 \(T\) 接受 \(z\) 当且仅当 \(z=0^n1^n\)回忆起这是一个 non-regular 的语言
  • 如果不停机,则因为 \(T\) 不停机,所以 \(L(T)=\varnothing\),而空集是 regular 的。

因此,如果能 decide \(L(T)\) 是否是 regular 的,则即可 decide 是否停机。

事实上,这个证明表明,一切对 \(L(M)\) 有不太弱的限定的 \(M\) 构成的集合,都是 undecidable 的。

对于 CFG \(G\)

  • 以下是无法判定的:
    • 普适性 (universality):是否 \(L(G)=\Sigma^*\)。即,其是否包含全体串。
    • 等价性 (equivalence):是否有 \(L(G)=L(H)\)
    • 二义性 (ambiguity):是否二义。
  • 以下是可判定的:
    • 空性 (emptiness):是否 \(L(G)=\varnothing\)
    • 有限性 (finiteness):\(L(G)\) 是否是有限集。
    • 成员验证 (membership):检查是否有 \(w\in L(G)\)​。

关于 TM 而言,有一个很有用的定理,即 Rice 定理:一切非平凡的 TM 的语义性质都是 undecidable 的。

解释:

  • 性质:即由 TM 构成的一个语言。
  • 语义性质:只与 TM 识别的语言有关。即,等价的 TM 要么同时满足该性质,要么同时不满足。
  • 非平凡:该性质非全集也非空集。

证明:

不失一般性,假设拒绝一切输入的 TM \(M_\varnothing\notin P\)(否则可以对 \(P\) 取反)。

此时,选择 \(M_0\in P\),然后假设 \(M_1\) 判定 \(P\),则用这些东西去建构 ATM

对于输入 \(\ip{M,w}\),构建 TM \(M'(x)\),其首先在 \(M\) 上模拟 \(w\)。如果模拟的结果是拒绝或循环,则相当于拒绝;否则(即模拟的结果是接受),则再在 \(M_0\) 上模拟 \(x\) 并输出其结果。

这时我们发现,当 \(M\) 接受 \(w\) 时,\(M'\) 等价于 \(M_0\);当 \(M\) 拒绝或循环 \(w\) 时,\(M'\) 等价于 \(M_\varnothing\)。此时使用 \(M_1\) 即可区分两种场合。

可以发现,上述 SOMETM 的证明正是使用了类似该方法的策略。


有一个较通用的方法:利用计算历史的规约,其中计算历史是 Turing 机处理某输入时经过的全体格局序列。形式化地讲,对于 TM \(M\) 和输入 \(w\)\(M\)\(w\) 上的一个 接受计算历史 (accepting computation history) 是格局序列 \(C_0,\dots,C_n\),其中 \(C_0\) 是起始格局、\(C_n\) 是某个接受态,\(C_{i+1}\)\(C_i\) 的后继;同理,拒绝计算历史 (rejectiing computation history),当 \(C_n\) 是某个拒绝态。

计算历史是有限序列,不停机的输入没有计算历史。确定性 Turing 机至多只有一个计算历史,而非确定性则可以有多个。

一个使用其的例子是 线性界限自动机 (Linear Bound Automaton, LBA):其是长度有限的 Turing 机,不允许指针移出输入所覆盖的段落;如果在受限区域的最左或最右端尝试移出,都会导致指针停在原地。该自动姬唯一一种扩充内存的方式是使用更大的纸带字符集 \(\Gamma\),但也只能使得存储增加常数倍。

虽然受限,但是 ADFA、ACFG、EDFA、ECFG 的判定器都可以使用 LBA 搭建。

令 ALBA 为判定 LBA 是否接受某个输入的问题。显然,LBA 的格局数目是有限的,而一个历史格局序列一旦出现了重复格局,则即可立刻断定其已陷入循环不可能停机了。因此,ALBA 的判定器很简单:跑格局数目步,若在此之前已停机则返回停机时的结果,否则拒绝。因此,ALBAdecidable 的。

但是,判定 LBA 是否不接受任何输入的问题,即 ELBA,却是 undecidable 的。具体而言,尝试使用 ELBA 的 oracle 判定 ATM

对于 ATM 的输入 \(\ip{M,w}\),构建 LBA \(B\),其接受 \(w\) 的全体接受计算历史,格局序列在输入 \(B\) 时用定界符 \(\#\) 分割。

LBA 检查格局序列是否是接受格局序列。其只需要检查 \(C_0\) 是否是起始态、\(C_n\) 是否是接受态;\(C_{i+1}\) 是否是 \(C_i\) 的后继即可,可以使用额外字符集标记指针位置等,而不需要额外的内存。

显然,该 \(B\) 不接受任何串,当且仅当 \(M\) 不接受 \(w\)。于是有 ELBA 的 oracle 即可判定 ATM,则 ELBA 即为 undecidable

另一个例子是 ALLCFG:判定某个 CFG 是否生成字符全集。将其规约至 ATM:对于 \(\ip{M,w}\) 的对,构造 CFG \(G\),令其派生所有串当且仅当 \(M\) 不接受 \(w\)。如何对敌?很简单:令 \(G\) 派生的串全体为所有 并非 \(M\) 上计算历史的串,即满足以下三者之一:

  • 不以起始格局开始。
  • 不以终止结局告终。
  • 存在一个非前驱-后继关系的中继对 \((C_i,C_{i+1})\)

构建 PDA 实现这一点:PDA 可以方便讨论使用三者中何者。前两者都是易判断的,但是唯独最后者较困难。一个想法是,非确定地为 \((C_i,C_{i+1})\) 定位后,使用栈存储 \(C_i\) 并与 \(C_{i+1}\) 对比。但是一个很明显的问题是栈仅支持逆序读取,因此二者不太好比较。因此令历史格局序列的存储方式稍作修改:令奇偶的格局正序逆序交替放置,这样经过栈反序后则二者即可比了。


除了自动姬相关的一批问题以外,还有其它的不可判定问题,例如 Post 对应问题 (Post Correspondence Problem, PCP) 接受有限个字符串对 \((x_i,y_i)\),寻求找到可重的有限 indices 列 \(i_1,i_2,\dots,i_k\) 满足 \(x_{i_1}+x_{i_2}+\dots+x_{i_k}=y_{i_1}+y_{i_2}+\dots+y_{i_k}\)

这个问题中的 Post 是问题的提出者。

PCP 是全体存在上述匹配的字符串对集合构成的 collection,而其是 undecidable 的。其证明正是应用了计算历史:考虑对于 \(\ip{M,w}\) 构建实例 \(P\) 使得其上的匹配都是 \(M\)\(w\) 上的接受计算历史。

\(M=(Q,\Sigma,\Gamma,\delta,q_0,q_\t{accept},q_\t{reject})\)。尝试构建 PCP 实例 \(P\) 使得 \(P\) 存在匹配当且仅当 \(M\) 接受 \(w\)

为了强制匹配都是接受计算历史,我们必须可以执行“指定某个对为起始对”这种行为。先假设这种行为被允许,则将对 \((\#,\#C_0\#)\) 作为起始对,其中 \(C_0\) 为起始格局 \(q_0w\)

然后尝试处理指针的移动。对于 \(a,b\in\Gamma,q,p\in Q\),如果 \(\delta(q,a)=(p,b,\t R)\),则添加对 \((qa,bp)\);对于一切 \(a,b,c\in\Gamma,q,p\in Q\),如果 \(\delta(q,a)=(p,b,\t L)\),则添加 \((cqa,pcb)\);对于一切 \(a\in\Gamma\),添加 \((a,a)\)

则因为 \(\#\) 只能靠 \((\#,\#)\) 匹配,所以两处 \(\#\#\) 间的部分除了指针状态可以靠前两种对转移以外,其它状态都只能照抄。

\[\begin{aligned} &{\color{red}\#}{\color{blue}0}{\color{green}1}{\color{yellow}2}{\color{orange}q3}{\color{magenta}4}{\color{cyan}5}{\color{lime}\#} \\&{\color{red}\#012q345\#}{\color{blue}0}{\color{green}1}{\color{yellow}2}{\color{orange}6p}{\color{magenta}4}{\color{cyan}5}{\color{lime}\#} \\\end{aligned} \]

以上例子是一个匹配的模式。

为了模拟向最右侧添加 \(\perp\) 的决策,不仅要可以用 \((\#,\#)\),还需要 \((\#,\perp\#)\)

会增广了,怎么停止呢?我们希望一旦 \(q_\t{accept}\) 出现,则其可以“吃掉”一大批不用的东西,因此需要 \((q_\t{accept}a,q_\t{accept})\)\((aq_\t{accept},q_\t{accept})\):但需要注意这里的 \(a\) 不包括 \(\#\)。最后,使用 \((q_\t{accept}\#\#,\#)\) 收尾。

现在考虑如何强制某个对出现在开头。解决方案是,令 \(\star s\) 为将 \(s\) 的每个字符前添加特殊字符 \(\star\) 得到的串,\(s\star\) 为之后添加,而 \(\star s\star\) 为除了两两字符间还有开头结尾的 \(\star\) 的串。如果要强制 \((x_1,y_1)\) 在开头,则修改其为 \((\star x_1,\star y_1\star)\),然后令所有其它的 \((x_i,y_i)\to(\star x_i,y_i\star)\),然后最后使用 \((\star\diamond,\diamond)\) 的特殊对收尾即可。

最后,如何处理“在最左侧左移要留在原地”这个操作?一个可行(但很麻烦)的策略是,改变 Turing 机:从起始态 \(q_0\) 出发的第一步手动标记起始位置,然后接下来在访问起始位置时特殊处理转移即可。

以上,我们证明了 PCP 可以被用于判定 ATM,于是 PCP 即为 undecidable 的。


语言 A Turing 可规约 (Turing Reducible) 至 B,如果有了 A 的 oracle 即可判定 B,记作 A ≤T B。

语言 A 多项式时间可规约 (Polynomial-Time Reducible) 至 B,如果存在一个多项式可计算的映射 \(R\),其将 A 的实例 \(x\) 映射到 B 的实例 \(y\),满足二者同步属于或不属于该语言,记作 A ≤P B。

一个函数是 递归函数 (recursive function) 如果存在 TM 使得对于一切输入 \(w\) 都停机,且停机时纸带上状态恰为 \(f(w)\)

语言 A 映射可规约 (Mapping Reducible) 至 B,如果存在递归函数 \(f\) 作为映射,使得 \(w\in A\iff f(w)\in B\),记作 A ≤M B,这个函数称作 A 至 B 的 规约 (reduction)。

如果 A ≤M B 且 B 可判定则 A 亦然,可识别则亦然。因此,映射可规约性可以被用于证明可识别性。

EQTM 接受所有 \(\ip{M_1,M_2}\) 实例,其中二者识别相同语言。

使用 Turing 规约,可以证明 EQTMundecidable 的:假如有 EQTM 的 oracle,则对于任意 \(M\) 只需要将其与某个不接受任何串的 \(M'\) 提供给 oracle,即可判定是否有 \(M\) 属于 ETM,而后者是 undecidable 的。

而使用映射规约,可以进一步证明其既 recognizable 也不 co-recognizable:

  • 自 ATMEQTM\(f(\ip{M,w})\) 映到 \(\ip{M_1,M_2}\),其中 \(M_1\) 拒绝一切,\(M_2\) 忽略输入并模拟 \(M\)\(w\) 上。
  • 自 ATM 到 EQTM\(f(\ip{M,w})\) 映到 \(\ip{M_1,M_2}\),其中 \(M_1\) 接受一切,\(M_2\) 忽略输入并模拟 \(M\)\(w\) 上。

映射规约的主要特点就是其对补集敏感(而 Turing 规约则不然)。具体而言,有 SOMETMT ETM,同时也有 SOMETMT ETM。但是鉴于 ETM 是 recognizable 的而 SOMETM 则不然,因此二者不能映射规约。因此,Turing 规约只能被用于证明不可判定性,而映射规约可以证明不可识别性。


朴素的映射规约是 多对一规约 (many-one reduction);然而,如果规约函数 \(f(\cdot)\) 恰好是一个单射,则其即为 单射规约 (one-one reduction)。

在证明 NP 完全性时,我们使用的是 多项式时间多对一规约 (polynomial-time many-one reductions, Karp reduction),即实例之间的转化关系。

而同样可以定义 多项式时间 Turing 可规约 (polynomial-time Turing reductions, Cook reduction),即提供多项式次的 oracle 调用渠道。

Cook 完全和 Karp-Levin 完全是否等价,目前仍然 open,且存在倾向于它们不等价的工作。

但是,一个语言多项式时间 Turing 可规约到另一个语言,并不意味着其是多项式可规约的,原因是实例之间的对应关系难以构建。我们并非总是能将 co-NP 的实例映射到 NP 实例。

VI. 可计算性理论的高级专题

这名字真挫。

递归定理:存在制造自身的机器。

形式化地说,每个 TM \(M\) 都存在自然数编码 \(\ip M\),同时 \(M\) 也存在无数个拥有不同编码的等价(拥有相同的接受、拒绝、循环态)TM,而 递归定理 (recursion theorem) 的正式描述即为:对于任何一个递归函数 \(t:\N\to\N\),存在 TM \(F\) 满足 \(t(\ip F)\) 是一个与 \(F\) 等价的 TM 的编码。

即,任何 \(t\) 都对某个输入近似映到自身。因此,其也被称作递归定理的 不动点形式:任意 Turing 可计算函数都存在不动点。

构建如下的 Turing 机 \(D\):它对于输入的某个 TM 编码 \(\ip M\),输出了如下 TM \(G\) 的编码:

  • \(G\) 对于输入 \(y\),找到 \(M(\ip M)\) 所编码的那个 Turing 机,然后对这个 Turing 机运行 \(y\) 并输出结果。

注意,\(M(\ip M)\) 可能并没有编码一个 Turing 机。但不论如何,如果它编码了一个 Turing 机,则 \(D(\ip M)\) 就应该返回它的编码。

但是,为什么不直接返回 \(M(\ip M)\),而要把它多此一举地嵌套在 \(G\) 的里面?因为这样做的话,\(D\) 是必然会停机的(尽管 \(G\) 在寻找 \(M(\ip M)\) 的时候不一定会停机)。如果 \(D,G\) 都停机了,我们便可以说 \(D(\ip M)=M(\ip M)\) 了。

考虑另一个 TM \(V\): 其对于输入 \(\ip M\),输出 \(t(D(\ip M))\)

那么,\(D(\ip V)\) 会输出什么呢?令其输出为 \(\ip F\),则 \(F\) 对于输入 \(y\),会用 \(y\)\(V(\ip V)\) 上运行。但是 \(V(\ip V)=t(D(\ip V))=t(\ip F)\),于是跑 \(F(y)\) 就是模拟 \(t(\ip F)\) 编码的 TM 输入 \(y\)


另一种本质等价但更易理解的证明是,构建一个网格,其每一行是 TM \(M_i\),每一列是输入 \(\ip{M_i}\)。则 \(M(\ip M)\) 对应着网格的对角线,而 \(D(\ip M)\),既然 \(D\) 也是一个 TM,则对应着网格的一行。这个对角线和这一行,同一列上的两个值应该相等。

\(V=t\circ D\),同样也对应着网格的一行。通过上述相等性,可以得到:\(V(\ip V)\)\(D(\ip V)\) 相等。

另一种思路是构造一个 Turing 机 SELF:其忽略输入并总是输出其自身的编码。

这建立在一个引理上:存在可计算函数 \(q:\Sigma^*\to\Sigma^*,w\mapsto\ip{P_w}\),其中 \(P_w\) 是忽略输入,只打印 \(w\)(指令纸带上内容恰为 \(w\))然后停机的 TM。这样的 \(P_w\) 可以通过硬编码 \(w\) 实现。

SELF 于是可以通过两部分 \(A,B\) 构成,且其总编码为 \(\ip{AB}\)。然后,\(A\) 的任务是打印 \(B\) 的描述,而 \(B\) 则反过来打印 \(A\) 的描述。

  • \(\ip{AB}\) 的理解方式是,\(A\) 会先在纸带上打印内容,\(A\) 停机后的东西再被当作 \(B\) 的输入执行 \(B\)

假设已经建立 \(B\),则只需要令 \(A=P_{\ip B}\) 即可。但是 \(B\) 不能反过来用 \(P_{\ip A}\) 定义:此时会出现循环定义。但是注意到 \(A\) 执行完后纸带上已经有了 \(\ip B\),因此将二者组合:

  • \(A=P_\ip B\)
  • \(B\) 是如下的 Turing 机:其对于输入 \(\ip M\),将 \(q(\ip M)\)\(\ip M\) 二者结合起来作为一个完整 TM 的编码。

当 SELF 被执行后,其将执行如下操作:

  • \(A\) 在纸带上打印出 \(B\) 的编码作为 \(B\) 的输入。
  • \(B\) 在知道它自己的编码后,使用 \(q(\ip B)\) 表示出 \(A\) 的编码,然后将二者拼接。

写成自然语言,可以被如下方式描述:

打印以下文本的两个副本,在第二个副本上加引号:
“打印以下文本的两个副本,在第二个副本上加引号:”

回忆起 Kleene's s-m-n Theorem 可莉捏的涩萌娘定理 ,Kleene 还有另一个贡献是 Kleene's Recursion Theorem 可莉捏的芮隽馨定理(雾) ,其是前述递归定理的扩展:令 \(T\) 是计算 \(t:\Sigma^*\times\Sigma^*\to\Sigma^*\) 的 Turing 机,则存在计算函数 \(r:\Sigma^*\to\Sigma^*\) 的 Turing 机 \(R\),使得对于一切 \(w\),都有 \(r(w)=t(\ip R,w)\)

这件事要求我们制造一个能看到其自己的描述,且用其计算的 Turing 机。将其分为三部分 \(A,B,T\),其中 \(T\) 由定理的叙述给出:

  • 对于输入 \(w\)\(A\) 在运行后在纸带上留下 \(w\ip{BT}\)
  • \(B\) 使用纸带上有的 \(\ip{BT}\) 还原出 \(\ip A\),然后用 \(A,B,T\) 三者拼出 \(\ip R\),最后清空纸带保留 \(\ip R\)\(w\) 作为 \(T\) 的输入。

另一种证明方式是使用 s-m-n 定理和朴素递归定理。

由 s-m-n,可以构建函数 \(s(x)\),其输出如下 TM 的编码:接受 \(y\) 并计算 \(T(x,y)\)

\(s\) 使用朴素的递归定理,得到 TM \(R\),则 \(R(y)\) 的效果是模拟编码为 \(s(\ip R)\) 的 TM 接受 \(y\) 的输出,也即 \(t(\ip R,y)\)

使用 Kleene 递归定理,即可在非形式化描述一个算法时,引入“利用递归定理得到其自身的编码”这样的操作。具体而言,前述的 SELF 可以描述为:

  • 对于任意输入,得到其自身编码,输出。

将其形式化描述,则为首先构建 \(T\):对于输入 \(\ip{M,w}\),打印 \(\ip M\) 并停机,然后使用递归定理得到 \(R\) 的效果是模拟 \(t(\ip R,y)\) 即输出 \(\ip R\),此时 \(R\)​ 即为你需要的 SELF。


使用 Kleene 递归定理,可以从另一个方向证明 ATMundecidable 的:如果 \(H(\ip M,w)\) 判定 ATM,则可以构建 \(R\),其效果是模拟 \(H(\ip R,y)\) 并取反,即,当 \(\ip R\) 接受 \(y\) 时,拒绝;当 \(\ip R\) 拒绝 \(y\) 时,接受——而这显然是矛盾的。

另一个例子是,令 MINTM 是全体编码长度极短的 TM,则其并非递归可枚举的。这是因为,如果它有枚举器 \(E\),则可以构建如下的 \(R\)

  • 对于 \(R(w)\),其使用 \(E\) 枚举全体 MINTM 中的 \(\ip{M_i}\) 直到找到了 \(|\ip{M_i}|>|\ip R|\) 的某个 \(M_i\),然后输出 \(M_i(w)\)(这里 \(M_i\) 的描述是通过枚举得到的,因此不占编码长度)。可以发现 \(R\)\(M_i\) 识别相同语言但是 \(R\) 更短。

Quine 是一个非空的 电脑程序,它不需要输入、且输出其自身源代码的复制。

但是,因为现代电脑的 Von-Neumann 架构,程序可以从内存中读取其自身,这样的 Quine 就作弊了,是一个 Cheating Quine


Kolmogorov 复杂度是一种衡量信息量的尺度。一个二进制串 \(x\)最小表示 (minimum description) \(d(x)\) 是最短的串 \(\ip{M,w}\),其中 \(M\)\(w\) 上停机时纸带上是 \(x\)。此时有 \(x\)Kolmogorov 复杂度 (Kolmogorov Complexity) \(K(x)=|d(x)|\)

先考虑 K 复杂度的一些性质吧。首先,因为可以使用立刻停机的空 Turing 机,所以必有 \(K(x)\leq|x|+c\);进一步,因为可以使用复制自身的 Turing 机,所以有 \(K(xx)\leq|x|+c\);最终,我们可以得到 \(K(x^n)\leq|x|+c\log n\)

一个串 \(x\)\(c\)-可压缩 (\(c\)-compressible) 的,如果 \(K(x)\leq|x|-c\);如果串 \(x\)\(1\)-可压缩都不是,则其是 不可压缩 (incompressible) 的。

任何长度的不可压缩串均存在。这是因为,长度小于 \(n\) 的描述数目(\(2^n-1\))严格小于长度不超过 \(n\) 的串数目(\(2^n\))。事实上,

\[\Pr_{x\in\cur{0,1}^n}[K(x)\geq|x|-c]\geq1-\dfrac1{2^c} \]

这意味着,绝大多数串都是非常不可压缩的

每个 \(c\)-可压缩串的长度至多为 \(n-c\)。这至多有 \(2^{n-c+1}-1\) 个描述。


定义 COMPRESS 为全体满足 \(K(x)\leq c\)\((x,c)\) 二元组。则 COMPRESS 是 undecidable 的:

若其 decidable,则可以构建 TM \(M(n)\),其以字典序枚举全体 \(y\),如果 \((y,n)\) 不属于 COMPRESS,则输出 \(y\) 并停机。则有 \(K(y)>n\),但是 \(M(n)\) 输出了 \(y\),则因为 \(|\ip{M,n}|=C+\log n\),所以在 \(n\) 充分大的时候,\(\ip{M,n}\) 是一个短的 \(y\) 的描述,矛盾。


Chaitin 不完备定理 (Chaitin's Incompleteness Theorem) 声称,如果在一个形式系统 \(F\) 中,所有自然语言可描述的数学命题都可以在 \(F\) 中被描述,并且验证一个 \(P\) 是否是另一个 \(S\) 的证明的问题是 decidable 的,则:

  • 对于足够大的 \(L\),对于一切 \(x\)\(K(x)>L\) 都是不可证明的。

假设可以证明某些 \(K(x)>L\),则对于全体证明,找到证明中字典序最小的 \(P\) 满足其证明某个 \(K(y)>L\)

那么考虑如下的 TM,对于输入 \(L\)

其按照字典序枚举全体 wf. 列 \(Q\),首先检查 \(Q\) 是否是合法的论证,然后检查论证的最后一行是否是 \(K(y)>L\);如果是,则输出 \(y\) 并停机。

则其是 \(y\) 的生成器,需要 \(|\ip{R,L}|=c+\log L\)。因此,当 \(L\) 充分大时,就产生矛盾了。

VII. 时间复杂性

TIME(\(t(n)\)):所有能在 \(t(n)\) 内被确定性 Turing 机判定的语言。

NTIME(\(t(n)\)):所有能在 \(t(n)\) 内被非确定性 Turing 机判定的语言。有 P=∪TIME(\(n^k\)),NP=∪NTIME(\(n^k\))。

Cook-Levin:SAT 是 NP 完全的。这是因为,对于一切 NTM \(M\) 及其输入 \(w\),可以构建 boolean formula \(\varphi_{M,w}\),其是可满足的当且仅当 \(M\) 接受 \(w\)

一次 \(n^k\) 步的计算可以用一个 \(n^k\times n^k\)格局表 (configuration table) 描述:每一行是一个格局,格局两端被加上了定界符 \(\#\) 限定非空方格的范围。

\(\varphi_{M,w}\) 的每个变量 \(x_{i,j,s}\) 的含义为:\(s\) 是否是 \((i,j)\) 格上的字符?然后验证某个格局表是否合法的 \(\varphi\) 可以由四个 \(\phi\) 或起来得到:

  • 验证每个 cell 是否有且仅有一个取值。
  • 验证初态是否合法。【可以通过硬编码输入串得到】
  • 验证转移是否合法。【除了大部分地方要求上下相同之外,转移仅需检测某个 \(2\times 3\) 的邻域】
  • 验证终态是否合法。【存在一个格子上记录了 accept 的 TM 状态】

我们经常从 ATM(HALTTM) 出发作规约。通常,逆向的规约也是可以做到的,因此二者是等价的。例如,我们已经将 ATM 归约到 PCP;反过来,通过枚举所有可能性,可以简单地将 PCP 归约到 ATM。因此,二者是 Turing 等价 (Turing Equivalent) 的。

Turing 度 (Turing Degree) 是复杂度等价类。我们已经知道两个 Turing 度了,它们分别是:

  • 0:decidable 的问题。
  • 0':与停机问题等价的问题。

有其它类吗?

SUPERHALT:有 HALTTM 作为 oracle 的停机问题。它的 Turing 度被定义为 0''。


与 Turing 度相对应的另一个概念是 算术层级 (Arithmetical Hierarchy),它侧重于逻辑表达式的形式而非计算难度。

称一个语言 \(L\) 是属于 Σi 的,如果存在一个总会停机的 TM \(M\),满足

\[x\in L\iff(\exists y_1)(\forall y_2)(\exists y_3)\dots(Q_iy_i)[M(x,y_1,\dots,y_i)\text{ accepts}] \]

其中,当 \(i\) 为奇数时 \(Q_i\)\(\exists\),为偶数时为 \(\forall\)\(y_i\) 可以是任何可数集中的元素。

同理,属于 Πi,如果为奇则为 \(\forall\),为偶则为 \(\exists\)

注意,同前束范式中衡量二者交替次数不同,此处要求必须严格交替。这是因为,每一个 \(\forall\)\(\exists\) 都可以针对一个元组进行,因此多个相邻的相同谓词可以被合并。

有 Σ0 = Π0 = 全体递归的(可判定的)语言集合。定义 Δi = Σi ∩ Πi

定理:Σ1 是全体递归可枚举(可识别的)语言集合。

如果 \(L'\) 属于 Σ1,有 \(x\in L'\) 等价于 \((\forall y)[(x,y)\in L]\) 其中 \(L\) 是递归语言,于是可以通过枚举 \(y\) 来识别 \(x\in L'\)

反之,如果存在识别 \(x\in L'\)\(M(x)\),则可以构建 \(M'(x,s)\),表示 \(M\) 是否在 \(s\) 步内停机。于是 \(M'\) 是可判定的,而 \(M\) 接受 \(x\) 当且仅当存在某个 \(s\)\(M'\) 接受 \((x,s)\)

注意,Turing 度使用 Turing 规约进行分割,而算术层级使用映射规约进行分割。

因此,因为 ATM 属于 Σ1,而对于全体 Σ1 的语言 L 均有 L ≤M ATM,因此可以得到:ATM 是 Σ1-complete 的。

ALLTM,即全体接受一切输入的 \(M\),是属于 Π2 的:这是因为 \((\forall x)[M(x)\text{ accepts}]\iff(\forall x)(\exists s)[M'(x,s)\text{ accepts}]\),而 \(M'\)decidable 的。

进一步,ALLTM 是 Π2-complete 的:一切 Π2 中的语言 L 都有 L ≤M ALLTM

这是因为 \(x\in L\iff (\forall y)(\exists z)R(x,y,z)\text{ accepts}\),其中 \(R\) 是一个总会停机的 TM。于是,对于给定的 \(x\),建立如下的 TM \(M_x\)

  • 对于输入 \(y\),初始 \(z=0\),然后不断令 \(z\) 自加直到 \(R(x,y,z)\) 被接受。然后 accept。

\(x\in L\) 等价于 \(M_x\) 属于 ALLTM

然而,ETM,即全体不接受任何输入的 \(M\),却是 Π1 的,因为 \((\forall x)[M(x)\text{ rejects}]\iff(\forall x)(\forall s)[M'(x,s)\text{ rejects}]\)

进一步,RECTM,所有 recursive 语言对应的 Turing 机的集合,是 Σ3 的。

  • 这些 Turing 机不一定是 decisional 的:只需要其 recognize 一个递归语言,即存在一个总会停机的 TM 和它 accept 相同语言即可。

\(L(M)\) 是 recursive 的,等价于 \(L(M)\)\(\ovl{L(M)}\) 均是 recognizable 的。

\(\ip M\) 属于 RECTM 等价于存在 recursive 的 \(N\),且 \(L(M)=\ovl{L(N)}\),等价于存在 recursive 的 \(N\)\(L(M)\cap L(N)=\varnothing,L(M)\cup L(N)=\N\)。进而,我们可以把“\(\color{lightblue}N\text{ is recursive}\)”“\(\color{pink}L(M)\cap L(N)=\varnothing\)”“\(\color{turquoise}L(M)\cup L(N)=\N\)”三条分别描述为“\(\color{lightblue}N\text{ halts}\) 属于 ALLTM”“\(\color{pink}L(M)\cap L(N)\) 属于 ETM”“\(\color{turquoise}L(M)\cup L(N)\) 属于 ALLTM”。


SUPERHALT,即所有 \(\ip{M^\t{HALT},w}\) 二元组,其中 \(M^\t{HALT}\)\(w\) 上停机,又如何呢?

其属于 SUPERHALT 当且仅当存在一个 \(s\) 满足在 \(s\) 步内停机。此时 SUPERHALT 调用了 HALT 不超过 \(s\) 次。

每一次调用,如果 HALT 返回 yes,则表明 \((\exists y)[M'(x,y)\text{ accepts}]\);返回 no,则 \((\forall z)[M'(x,z)\text{ rejects}]\)。因此,\(\ip{M^\t{HALT},w}\) 属于 SUPERHALT,当且仅当

\[(\exists s)(\exists y_1)\dots(\exists y_s)(\forall z_1)\dots(\forall z_s)[\dots] \]

其中每一次调用 HALT 视结果而定,在最终表达式中使用 \(y_i\)\(z_i\)。虽然 \(y\)\(z\) 的数量都依赖于 \(s\),但是注意到它们合并在一块也仍然可数,因此得到结论:SUPERHALT 属于 Σ2

易知 ALLTMT SUPERHALT。

假设存在 ATM 的 oracle(其与 HALTTM 的 oracle 等价),则构建如下的 NHALT:其忽略输入 \(y\),不断自加计数器 \(x\),直到 \(\ip{M,x}\) 不属于 ATM,此时拒绝。则如果 NHALT 关于某个输入不属于 SUPERHALT,则 \(M\) 即属于 ALLTM

从另一个角度而言,又有 SUPERHALT ≤T ALLTM

ALLTM 是 Π2-complete 的,但是鉴于 SUPERHALT 是 Σ2 即 co-Π2 的,所以同样可以 decide SUPERHALT。


存在一个在 HALT 和 decidable 之间的问题吗?存在!Post 问题 (1944)。事实上,存在无穷多个 Turing 度。

INF. 总结

REGEXP/CFG:统一的证明方法之一,是证明一段东西的长度超过总状态数,进而有两个态撞车。

NFA->DFA:状态压缩 DP。\(2^{|Q|}\) 的界被识别倒数第 \(k\) 位是 \(1\) 的串 bound。

NFA->REGEXP:首先引入所有转移可以是 REGEXP 的 GNFA,然后可以不断压缩 GNFA 直到双态 GNFA,此时其就是 REGEXP 了。

REGEXP 泵引理:一切 REGEXP 都存在阈值,使得任何长度至少为该阈值的串都可以在前阈值位内找到泵子串。必要而不充分。

CFG 是生成一种语言的方式,而一个语言是 CFL 如果它可以被某种 CFG 生成。CFG 具有二义性如果某个串可以被多种语义树生成,而一个 CFL 是先天二义的如果所有生成之的 CFG 都是二义的。

PDA->CFG:只需要常数态,在栈中维护语法树上的遍历过程。

CFG->PDA:把 PDA 上某个字符从压栈到弹栈的过程建模为一个变量。

CNF:所有转移都是一对二的转移。

CYK:验证串是否被某个 CNF 生成。

CFL 的泵:超过阈值的串存在不超过阈值的泵子串对。


ATM undecidable:假设 \(H\) 输入 \(M,w\) 给出判定,则 \(D\) 输入 \(M\)、调用 \(H(M,\ip M)\) 并给出相反结果,则考虑 \(D(\ip D)\),即可导出矛盾。

另一种证法是使用 recursion theorem:如果 \(H(\ip M,w)\) 判定 ATM,则可以构建 \(R\),其效果是模拟 \(H(\ip R,y)\) 并取反。

由此得到证明 undecidability 的几种策略:

  • Turing 规约到某个 undecidable 的问题。可以使用的问题列表:ATM 判定 Turing 机接受某个输入,HALTTM 判定 Turing 机在某个输入上停机,SOMETM 判定接受某个输入,ETM 判定不接受任何输入,EQTM 判定两个 Turing 机等价,REG 判定 Turing 机识别正则语言,ALLCFG 判定 CFG 接受一切串(使用计算历史规约),PCP。
  • 对角化方法。
  • (尝试计算历史规约)。
  • 尝试递归定理(不动点形式或得到编码形式)。

比 undecidability 更强的 un(co)recognizability 则不能使用 Turing 规约,只能使用映射规约。

posted @ 2025-04-07 16:50  Troverld  阅读(202)  评论(0)    收藏  举报