计算理论:编码与图灵机

计算理论:编码与图灵机

语言

一个 字母表 (alphabet) 是一个非空有限集合,该集合中的元素称为 符号/字符 (symbol)

令 $\Sigma^\ast$ 表示非负整数个字母表 $\Sigma$ 中的字符连接而成的串,字母表 $\Sigma$ 上的一个 语言 (language) 是 $\Sigma^\ast$ 的一个子集。

需要注意的是,这里的 语言 是一个抽象的概念,通常意义上的字符串是语言,所有的 01串 也可以是一个语言。

任何语言都可以通过 编码 转化成“01串”的形式,所以在下文中不加说明时 $\Sigma={0, 1}$。

编码

在进行程序设计时,通常给每一个字符标记一个单独的代码来表示一组字符,即 编码

在进行 二进制编码 时,假设所有的代码都等长,那么表示 $n$ 个不同的字符需要 $\left \lceil \log_2 n \right \rceil$ 位,称为 等长编码

如果每个字符的 使用频率相等,那么等长编码无疑是空间效率最高的编码方法,而如果字符出现的频率不同,则可以让频率高的字符采用尽可能短的编码,频率低的字符采用尽可能长的编码,来构造出一种 不等长编码,从而获得更好的空间效率。

在设计不等长编码时,要考虑解码的唯一性,如果一组编码中任一编码都不是其他任何一个编码的前缀,那么称这组编码为 前缀编码,其保证了编码被解码时的唯一性。

问题

在计算理论中,问题主要有两种:判定问题功能性问题

判定问题

判定问题 就是只能用 回答的问题,本质上是判定一个串是否属于一个语言,即:$f:\Sigma^\ast\rightarrow{0, 1}, f(x)=1\iff x\in L$ 是一个关于字母表 $\Sigma$ 和语言 $L$ 的判定问题。如,“判定一个数是不是一个质数”就是一个判定问题。

判定问题由于其简洁性而常常被作为计算理论研究的对象。下文中不加说明时,“问题”都指“判定问题”,当然,有时一些命题也能简单地推广到其它问题上。

一个语言也可以代指“判定一个串是否属于这个语言”这个判定问题,因此,“语言”和“问题”可以视作同义词。

功能性问题

功能性问题 的回答不止 ,可以是一个数或是其它。如,“求两个数的和”就是一个功能性问题。

任何功能性问题都可以转化为一个判定问题,如,“求两个数的和”可以转化为“判定两个数的和是否等于第三个数”。

判定问题也可以转化为一个功能性问题:求这个判定问题的指示函数,即上文中判定问题定义里的 $f$。

图灵机(确定性图灵机)

不加说明时,图灵机往往指 确定性图灵机,本文中也是如此。

图灵机有很多不同的定义,这里选取其中一种,其它定义下的图灵机往往与下面这种定义的图灵机计算能力等价。

图灵机 是一个在一条可双向无限延伸且被划分为若干格子的纸带上进行操作的机器,其有内部状态,还有一个可以在纸带上进行修改与移动的磁针。

形式化地说,图灵机是一个七元组 $M=<Q,\Gamma,b,\Sigma,\delta,q_0,F>$,其中:

  • $Q$ 是一个有限非空的 状态集合
  • $\Gamma$ 是一个有限非空的 磁带字母表
  • $b\in\Gamma$ 是 空字符,它是唯一一个在计算过程中可以在磁带上无限频繁地出现的字符;
  • $\Sigma\subseteq(\Gamma\setminus{b})$ 是 输入符号集,是可以出现在初始磁带(即输入)上的字符的集合;
  • $q_0\in Q$ 是 初始状态
  • $F\subseteq Q$ 是 接受状态,如果一个图灵机在某个接受状态停机,则称初始磁带上的内容被这个图灵机 接受
  • $\delta :(Q\setminus F)\times \Gamma \not \to Q\times \Gamma \times {L,R}$ 是一个被称作 转移函数 的部分函数(即只对定义域的一个子集有定义的函数)。如果 $\delta$ 在当前状态下没有定义,则图灵机停机。

图灵机从初始状态与纸带起点起,每次根据当前的内部状态 $x$ 和当前磁针指向的纸带上的单元格中的字符 $y$ 进行操作:若 $\delta(x, y)$ 没有定义则停机,否则若 $\delta(x, y)=(a, b, c)$,则将内部状态修改为 $a$,将磁针指向的格子中的字符修改为 $b$,若 $c$ 为 $L$ 则向左移动一格,为 $R$ 则向右移动一格。

其实,知道图灵机的工作细节是不必要的,只需建立直观理解即可。

图灵机 $M$ 在输入 $x$ 下的输出记作 $M(x)$($M(x)=1$ 当且仅当 $M$ 接受 $x$,$M(x)=0$ 当且仅当 $M$ 在输入 $x$ 下在有限步骤内停机且 $M$ 不接受 $x$),也可以在括号内包含多个参数,用逗号隔开,具体实现时可以向字母表中添加一个元素表示逗号来隔开各个参数。

还有其他的图灵机,如 非确定性图灵机多带图灵机

图灵机的编码

注意,这个“编码”与上文中的 编码 没有任何关系。

图灵机可以被自然数编码,即存在满射函数 $f:\mathbb{N}\to\mathbb{M}$,使得每个自然数都对应一个图灵机,而每个图灵机都有无数个编码。因此,由若干图灵机构成的集合可以是一个语言。

记由自然数 $\alpha$ 编码的图灵机为 $M_{\alpha}$。

通用图灵机

存在一台图灵机 $\mathcal U$ 满足:

  1. 若 $M_{\alpha}$ 在输入 $x$ 下在有限时间内停机,则 $\mathcal{U}(x, \alpha)=M_{\alpha}(x)$,否则 $\mathcal{U}(x, \alpha)$ 不会在有限时间内停机;
  2. 如果对于任意 $x\in{0, 1}^\ast$,$M_\alpha$ 在输入 $x$ 下在 $T(|x|)$ 时间内停机,则对于任意 $x\in{0, 1}^\ast$,$\mathcal{U}(x, \alpha)$ 在 $O(T(|x|)\log T(|x|))$ 时间内停机。

即存在一台 通用图灵机,它能模拟任何一台图灵机,且花费的时间只会比这台被模拟的图灵机慢其运行时间的对数。

可数无穷与不可数无穷

对于一个无穷集,若该集合内的元素能与自然数一一对应,则称这个集合为 可数无穷 的;否则其为 不可数无穷 的。

形式化地说,对于无穷集 $S$,若存在单射 $ f:\mathbb{N}\to S$,则 $S$ 为 可数无穷 的;否则 $S$ 为 不可数无穷 的。

可计算性

对于一个判定问题,若存在一个总是在有限步内停机且能够正确进行判定的图灵机,则这个问题是一个 图灵可计算 的问题,否则这个问题是一个 图灵不可计算 的问题。

由于图灵机可以被自然数编码,所以图灵机的个数是 可数无穷,而语言(即二进制串的集合)的个数是 不可数无穷,而每个图灵机最多判定一个语言,所以一定存在图灵不可计算的问题。

停机问题

停机问题 是一个经典的图灵不可计算问题:给定 $\alpha$ 和 $x$,判定 $M_{\alpha}$ 在输入为 $x$ 时是否会在有限步内停机。

通俗的说,停机问题是图灵不可计算的 意味着:不存在这样一个程序,它能够计算任何程序在给定输入上是否会停止运行。

停机问题是图灵不可计算的证明:

定义函数 $\mathsf{UC}:{0,1}^\ast\to{0,1}$ 为:
$\mathsf{UC}(\alpha)=\begin{cases}0&M_\alpha(\alpha)=1 \ 1&\text{otherwise}\end{cases}$
我们先证明 $\mathsf{UC}$ 函数是图灵不可计算的:
假设存在一台图灵机 $M_{\beta}$ 能够计算 $\mathsf{UC}$,那么根据 $\mathsf{UC}$ 的定义可以得到 $\mathsf{UC}(\beta)=1\iff M_\beta(\beta)\neq 1$,而根据 $M_{\beta}$ 能够计算 $\mathsf{UC}$ 可以得到 $M_{\beta}(\beta)=\mathsf{UC}(\beta)$,产生了矛盾,所以假设不成立,不存在可以计算 $\mathsf{UC}$ 的图灵机。
令 $M_{\mathsf{HALT}}$ 是一个可以解决停机问题的图灵机,$M_{\mathsf{HALT}}(x,\alpha)$ 的值是判定问题 $M_\alpha$ 在输入为 $x$ 时是否会在有限步内停机的解,那么我们可以构造出一台能够计算 $\mathsf{UC}$ 函数的图灵机 $M_{\mathsf{UC}}$:
$M_\mathsf{UC}$ 首先调用 $M_\mathsf{HALT}(α,α)$, 如果它输出 $0$, 则 $M_\mathsf{UC}(α)=1$;否则,$M_\mathsf{UC}$ 使用通用图灵机模拟计算得到答案。
由于 $\mathsf{UC}$ 函数是图灵不可计算的,所以 $M_\mathsf{HALT}$ 不存在,也就是说停机问题是图灵不可计算的。

丘奇 - 图灵论题

丘奇 - 图灵论题 称,若一类问题有一个有效的方法解决,则这类问题可以被某个图灵机解决。

其中,“有效的方法”需要满足:

  1. 包含有限条清晰的指令;
  2. 当用其解决这类问题的其中一个时,这个方法需要在有限步骤内结束,且得到正确的答案。

这个论题没有被证明,但其是计算理论的一条基本公理。

哥德尔不完备定理

从上文中,我们不难发现,在 计算理论 这个系统中,存在 停机问题 这样既无法证明也无法证伪的命题,众所周知即 悖论

形式化地说,若命题 $A$ 满足 $(A \Rightarrow \lnot A) \land (\lnot A \Rightarrow A)$,则命题 $A$ 为悖论。

那么,悖论的出现是否是不可避免的呢?

1931年,一位名叫 库尔特·哥德尔 的数学家发表了一篇论文,在这篇论文中,他发表并证明了以下两个定理:

哥德尔第一不完备定理
在满足某个条件的形式系统中,存在满足以下两个条件的语句 $A$。

  • 该形式系统中不存在 $A$ 的形式证明。
  • 该形式系统中不存在 $\lnot A$ 的形式证明。

哥德尔第二不完备定理
在满足某个条件的形式系统中,不存在“表示该形式系统自身相容性的语句”的形式证明。

显然,哥德尔第一不完备定理 就表明了,任何一个形式系统中都一定会有悖论的出现。

那么,这一天才的想法是怎么被提出的,又是怎么被证明的呢?敬请期待 高二学年脑洞班——《哥德尔不完备定理》

posted @ 2022-05-23 22:56  WalkerV  阅读(836)  评论(0编辑  收藏  举报