Theory of Computation: Reduction

4 minute read

Published:

不知道在写什么。

学计算理论的时候发现规约这个东西太抽象了,而且可能会有很多考法。笔者在此整理了 PPT 上的例子,希望能够帮助大家理解这个东西,并且提供一些新的思考。

规约的定义

定义:对于 $A,B$ 两个在 $Σ$ 上的语言,如果存在一个 recursive function $f: Σ^* \to Σ^$,使得对于任意 $x \in Σ^$,有 $x \in A \Leftrightarrow f(x) \in B$,则称 $A$ 可规约到 $B$,记作 $A \leq B$。

思考一下这个当且仅当是为什么。他的意思就是,语言 $A$ 可以通过一系列可计算变化,变成语言 $B$ 的子集,而且这些变化一定是:

  • 可计算的,也就是 recursive function。不然毫无意义。

  • 对于非 $A$ 的字符串,变化后一定不在 $B$ 里面。

第二条是为什么呢?我们来看下面的内容。

规约的性质

定理:$A \leq B$ 且 $B$ 是可判定的,则 $A$ 也是可判定的。

这个定理的证明是很简单的,因为我们可以通过 $f$ 来构造一个判定 $A$ 的算法:

  • 对于要判定的字符串 $a$,我们先计算 $f(a)$。

  • 如果 $f(a) \in B$,则 $a \in A$;否则 $a \notin A$。

  • 判断 $f(a) \in B$ 是直接用判定 $B$ 的图灵机即可。

推论就是其逆否命题:

推论:$A \leq B$ 且 $A$ 是不可判定的,则 $B$ 也是不可判定的。

可以发现,如果我搞一个 $f(x) = e$,那显然 ${e}$ 是可判定的,但是这样就毫无意义了。所以我们要求规约的 $f$ 是一个对于任意 $x \in Σ^*$,有 $x \in A \Leftrightarrow f(x) \in B$ 的函数。

还有一个推论:

推论:$A \leq B \Leftrightarrow \overline A \leq \overline B$。

判定

我们接下来要证明的判定问题,其语境是判定图灵机和一个输入,是否满足 XXX 性质

在 Universal Turing Machine 的语境下,我们可以通过输入 $\langle M, x \rangle$ 来表示一个图灵机和一个输入。所以一个图灵机和一个输入就可以唯一确定一个字符串。我们接下来讨论的判定问题就是,给一个字符串(这个字符串是由图灵机和输入构成的,类似一个压缩包),判断这个图灵机和输入是否满足某种性质。

先做一些约定吧:

  • 我们证明的思路,是已知停机问题是不可判定的,然后通过规约来证明其他问题是不可判定的。接下来证明的东西全都是不可判定的

  • 我们会把要判定的字符串统一写成 $\langle M, x \rangle$,代表一个压缩包。最后我们要判定的语言肯定不包括「无效的压缩包」。图灵机的压缩可以参考 PPT 和学长笔记,这里不再赘述。

  • 假设存在一个 Universal Turing Machine $U$,他可以接受一个字符串 $\langle M, x \rangle$,然后模拟 $M$ 在输入 $x$ 上的运行。后面我会直接写成 $U$ 这个符号。

  • 可以发现,$f$ 不一定要是一个一一映射,他可以是多对一的。不过在现实语境下,我们只需要构造一个一一映射的 $f$ 就可以。那么在图灵机的语境下,很多一一映射其实在逻辑上是显然成立的,比如令 $f(\langle M, x \rangle)$ 为一个融合了老图灵机和输入的新图灵机,这显然是一个一一映射,后面会看到很多这样的做法。

  • 重要!:$w$ 特别表示停机问题中 $w$ 的输入!!!不是改造后的自动机 $M_w$ 的输入!!!

例子

已知的结论是什么?

  • 判定问题 $A_0$:给定一个图灵机 $M$,判断 $M$ 是否在输入 $w$ 上停机。

接下来我们统一写成这样的形式:

  • \[A_0 = \{ \langle M, w \rangle | M \text{ halt on } w \}\]

根据停机问题的结论,这是不可判定的。

三个最简单的判定问题

  • \[A_1 = \{ \langle M \rangle | M \text{ halt on } e \}\]

意思是说,判定一个图灵机是否在空串上停机。

一看就是不可判定的啊,第一眼的思路是,这不就是停机问题的子集嘛?这其实就是判断一个图灵机是否在给定输入上停机的问题,只不过我们固定这个输入是 $e$。所以应该是不能判定的。但是我们只能把 $A_1$ 规约到 $A_0$ 上,无法证明 $A_1$ 是不可判定的。

所以我们证明的思路是,证明 $A_0$ 可以规约到 $A_1$ 上。这样就可以证明 $A_1$ 是不可判定的。

这不是很抽象么?但是好像只有这条路可以走。我们直接考虑把停机问题魔改一下,看看能不能转化成 $A_1$。

一个思路是,我把输入融合到图灵机里,这样输入是不是就是空串了?我们可以构造一个新图灵机 $M_w$,他的输入是 $e$,他的行为是:

  • 先把输入 $w$ 写到输入带上

  • 然后再运行 $M$

这样 $M_w$ 就是一个在空串上运行的图灵机了。我们只需要判断 $M_w$ 是否在空串上停机就可以了。这样我们就成功的完成了规约。

整理一下,我们的构造函数就是:

\[f(\langle M, w \rangle) = \langle Rw_1Rw_2\cdots L_{⌴ }M, e\rangle\]

这显然是一个一一映射,因为对于 $M_w$ 我们都可以反解出 $M$ 和 $w$。所以我们证明了 $A_0 \leq A_1$,所以 $A_1$ 是不可判定的。


  • \[A_2 = \{ \langle M \rangle | M \text{ halt on any input string} \}\]

这个问题是判断一个图灵机是否在某个输入上停机。这似乎不那么显然了,但是我们还是可以用刚才的思路去走。

我们只要大力套用 $A_1$ 的证明思路。我们沿用 $M_w$ 的构造,只不过我们加一个判断

  • 判断输入是否是空串,如果不是空串,就死循环

  • 先把输入 $w$ 写到输入带上。

  • 然后再运行 $M$。

这样,我们就构造出了一个图灵机 $M_w$,我们判断 $M_w$ 是否存在一个输入可以停机即可。非常搞笑的是,如果 $M_w$ 停机,那给定的输入肯定是 $e$,这样我们就证明了 $A_0 \leq A_2$,所以 $A_2$ 是不可判定的。

仔细咀嚼一下这个思路,你就可以发现有多大力出奇迹了。关键是,这么大力的依据是什么呢?那就是,显然这个问题比停机问题强多了!人家只需要判断一个输入,而你需要判断所有输入。所以我们在证明的时候也可以大力一些。


  • \[A_3 = \{ \langle M \rangle | M \text{ halt on every input string} \}\]

老思路,但是判断的 trick 用不了了,因为这样对于所有非 $w$ 输入都会停机…那我们还可以把输入给擦除啊!我们构造一个新图灵机 $M_w$,他的行为是:

  • 先把输入全部抹除

  • 再把输入 $w$ 写到输入带上。

  • 然后再运行 $M$。

这样,我们判断 $M_w$ 是否在任意输入上停机就可以了。这样我们就证明了 $A_0 \leq A_3$,所以 $A_3$ 是不可判定的。这个思路其实也可以用来证明 $A_2$。

我又想到,其实还可以构造这样的 $M_w$:

  • 判断输入是否是空串,如果不是空串,就停机

  • 再把输入 $w$ 写到输入带上。

  • 然后再运行 $M$。

读者可以想一下这样为啥可以规约。接下来的例子希望读者自己思考,然后再看答案 (因为我写这个讲义也是自己思考了一遍的,没直接看答案)

两个图灵机?

  • \[A_4 = \{ \langle M_1, M_2 \rangle | L(M_1) = L(M_2) \}\]

判断两个图灵机是否 halt on the same input string。这个问题看起来很复杂,但是我们可以用刚才的思路来证明。

直接规约好像毫无思路,我们想想看如果直接做怎么做,那肯定是遍历每一个输入,然后看是否停机,如果都停机/都不停机就尝试下一个输入,否则不接受。但这显然有两个问题:

  • 无穷多个输入,根本无法给出「接受」。

  • 无法判断是否停机。

那答案肯定是无法判定的,因为比停机问题强太多。借此,我们可以想到,好像可以把停机问题规约过来,如果用刚才的 $M_w$,然后构造一个永远停机的图灵机 $H_{\text{halt}}$,$L(H_{\text{halt}})=\sum^*$,判断他们是否等价不就可以了嘛?

答案呼之欲出,构造一个新图灵机 $M_w$,他的行为是:

  • 再把输入 $w$ 写到输入带上。

  • 然后再运行 $M$。

注意:如果 $M$ 在 $w$ 上停机,那么 $L(M_w)$ 是 $\sum^*$,否则是空语言

这样我们只要判断 $M_w$ 和 $H_{\text{never}}$ 是否 halt on the same input string 就可以了,如果 halt on the same input string 说明停机——$L(M_w)$ 是 $\sum^*$ 嘛,否则不停机。这样我们就证明了 $A_0 \leq A_4$,所以 $A_4$ 是不可判定的。

PPT 上的证明和我的思路不一样,其实是等价的,他是证明 $A_3$ 可以规约到 $A_4$ 上。然后怎么做 $A_3$ 呢?他构造了一个新的永远停机的 $M’$,然后判断 $M’$ 和 $M$ 是否等价。这样也是可以的,只不过我的做法更好想(x)

正则/上下文无关/可递归?

  • \[A_5 = \{ \langle M \rangle | L(M) \text{ is regular} \}\]
  • \[A_6 = \{ \langle M \rangle | L(M) \text{ is context-free} \}\]
  • \[A_7 = \{ \langle M \rangle | L(M) \text{ is recursive} \}\]

其实 $A_7$ 肯定是不可判定的,因为这就是 $A_3$,我们先思考一下 $A_5$ 怎么做吧。

还是可以大力一点,我们继续考虑停机问题。我们可以构造一个新的图灵机 $M_w$ 实现这样的效果:

  • 如果 $M$ 在 $w$ 上停机,那么 $L(M_w)$ 是 regular。

  • 如果 $M$ 在 $w$ 上不停机,那么 $L(M_w)$ 是 non-regular。

当然,上下可以相反,那么我们先随便找一个 non-regular 的语言,比如 $L = {0^n1^nn \geq 0}$。然后构造这样的 $M_w$:
  • 判断输入(注意这里的输入不是 $w$,是 $M_w$ 的输入)是否属于 $L$,如果属于 $L$,就停机

  • 再把输入 $w$ 写到输入带上。

  • 然后再运行 $M$。

这样如果 $M$ 在 $w$ 上停机,那么 $L(M_w)=\sum^*$ 是 regular 的,如果 $M$ 不停机,那么 $L(M_w)$ 是 non-regular 的,因为它只在一个非正则的语言 $L$ 上停机。所以我们判断 $L(M_w)$ 是否正则,就可以推断停机问题。我们也就此证明了 $A_0 \leq A_5$,所以 $A_5$ 是不可判定的。

$A_6$ 的证明思路显然也是同理的。

Rice 定理

之前我们利用停机问题规约证明的不可判定方法有一个共性就是,他们都是为了判定这样的集合:

\[A = \{ \langle M \rangle | L(M) \text{ 满足某种性质 P} \}\]

如果设满足所有性质 P 的 recursively enumerable 语言集合为 $L_P$,那么等价于判定:

\[A = \{ \langle M \rangle | L(M) \in L_P \}\]

有这样的定理:

定理(Rice 定理):如果 $L_P$ 是空集或者包含所有 recursively enumerable 语言,那么 $A$ 是可判定的;反之那么 $A$ 是不可判定的。

意思是说,对于所有 recursively enumerable 语言都满足的性质(或者都不满足),才可以被判定。这是一个非常强的定理,因为他告诉我们,只要有一个例外,就不可判定。你观察一下前面的例子,就会发现他们都是这样的。所以我们可以用 Rice 定理来判断很多不可判定的问题。

思考一下这个很强的定理的证明,还是考虑规约。

首先如果 $L_p$ 是空集,那么显然 $A$ 是空语言,这是可判定的。

然后是一个分类讨论:

情况 1

如果 $L_p$ 不包含空语言,我们尝试把 $A_0$ 规约到 $A$ 上。我们只需要构造一个新图灵机 $M_w$,他的行为是:

  • 把输入 $w$ 写到输入带上。

  • 然后再运行 $M$。

如果 $M$ 在 $w$ 上不停机,那么 $L(M_w)$ 是空语言,不属于 $L_p$。如果 $M$ 停机,那么 $L(M_w)$ 为 ${e}$,但是我们不知道它是不是属于 ${L_p}$。所以我们随便找一个 $L_p$ 中的语言 $L_0$,修改 $M_w$ 的行为:

  • 判断是否属于语言 $L_0$,这里直接用 $L_0$ 对应图灵机判断即可,如果不属于则自动死机。

  • 把输入 $w$ 写上。

  • 然后再运行 $M$。

这样的话,如果 $M$ 在 $w$ 上停机,那么 $L(M_w)$ 是 $L_0$,属于 $L_p$。如果 $M$ 不停机,那么 $L(M_w)$ 是空语言,不属于 $L_p$。这样我们又规约成功了。

情况 2

如果 $L_p$ 包含空语言,最简单的方法是考虑其补集 $\overline{L_p}$。显然 $\overline{L_p}$ 不包含空语言。

  • 如果 $L_p$ 是 recursively enumerable 集合的全集,那么补集是空集,补集可判定,$L_p$ 对应的集合 $A$ 也可判定。

  • 反之,如果 $L_p$ 不是全集,那么补集不是空集,补集不可判定,$L_p$ 对应的集合 $A$ 也不可判定。

这样我们就证明了 Rice 定理。冷静下来看,其实这个证明正是 $L_5$、$L_6$、$L_7$ 证明的一般形式所以写了这么多,前面都白写了啊,艹了。

这些题目都是最简单的,但是也是最经典的,后面有很多很多的变式题,大家可以参考一下 98 资料。