VisFormalLang 形式语言可视化

第 11 章 计算的极限

| 关于   英文版   «  11.1. 归约   ::   目录   ::   11.3. 不可解问题  »

11.2. 递归可枚举语言

11.2.1. 递归可枚举语言

什么是图灵机所接受的语言集合?我们知道它们接受正则语言和上下文无关语言,以及其他更多的语言。

问题:是否存在图灵机无法接受的语言?

定义:如果存在图灵机 \(M\),使得 \(L = L(M)\),则语言 \(L\) 是 递归可枚举的。

[哈!这只不过说明,图灵机能处理的这些语言现在有了个名字!]

lt25hier1

我们说图灵机 \(M\) 接受该语言。对 \(L\) 中的每一个 \(w\),\(M\) 都应该接受 \(w\)。

问题:如果 \(w\) 不在 \(L\) 中,会发生什么?说 \(M\) 能正确接受 \(L\) 中的字符串,并没有定义当 \(w\) 不在 \(L\) 中时会发生什么。在这种情况下,\(M\) 可能不会停机。

注意:我们不会得到是或否的回答,只有当 w 属于 L 时才会回答是!

定义:如果存在图灵机 \(M\),使得 \(L = L(M)\),并且 \(M\) 对每一个 \(w \in \Sigma^+\) 都停机,则语言 \(L\) 是 递归的。因此,语言 \(L\) 是递归的,当且仅当存在一个关于它的成员判定算法。

[注意区分递归 语言 (由图灵机识别的语言)和 递归 算法 (仅仅指调用自身的算法)。]

注意:我们将忽略空字符串。在第 9 章中,图灵机的定义假定输入字符串的两侧总是加上空格。如果输入可能是空白符,带头就无法知道输入字符串从哪里开始。要修改定义使其包含空字符串是很容易的,但目前我们只讨论不包含 \(\lambda\) 的语言。

备注

如果我们用单侧带作为基本定义,这就不是问题,而这正是采用这种定义方式的一个很好的理由。

11.2.1.1. 递归语言的枚举过程

要枚举递归语言 \(L\) 中的所有 \(w \in \Sigma^+\):

* 设 \(M\) 为识别 \(L, L = L(M)\) 的图灵机。| * 构造双带图灵机 \(M'\) | 带 1 将枚举 \(\Sigma^+\) 中的字符串 | 带 2 将枚举 \(L\) 中的字符串。 | - 在带 1 上生成 \(\Sigma^+\) 中的下一个字符串 \(v\) | - 在 \(v\) 上模拟 \(M\) | 如果 \(M\) 接受 \(v\) ,则在带 2 上写入 \(v\) 。

11.2.1.2. 递归可枚举语言的枚举过程

上面的过程不适用,因为对于不在该语言中的字符串, \(M\) 可能不会停机。

要枚举递归可枚举语言 \(L\) 中的所有 \(w \in \Sigma^+\):

永远重复:
* 生成下一个字符串(假设已经生成了 k 个字符串: \(w_1, w_2, ..., w_k\))
* 在 \(w_k\) 上运行 \(M\) 一步。
在 \(w_{k-1}\) 上运行 \(M\) 两步。
...
在 \(w_{1}\) 上运行 \(M\) \(k\) 步。
如果有任何一个字符串被接受,则把它们写到 2 号带上。
注意:要在恰好这么多步数内被接受!
\[\begin{split}\begin{array}{llll} 1\ \mbox{move} \ w_1 \\ 1\ \mbox{move} \ w_2 & 2\ \mbox{moves} \ w_1 \\ 1\ \mbox{move} \ w_3 & 2\ \mbox{moves} \ w_2 & 3\ \mbox{moves} \ w_1 \\ 1\ \mbox{move} \ w_4 & 2\ \mbox{moves} \ w_3 & 3\ \mbox{moves} \ w_2 & 4\ \mbox{moves}\ w_1 \\ ... \\ \end{array}\end{split}\]

问题:

  1. 是否存在是 RE 但不是递归的语言?是。

  2. 是否存在不是 RE 的语言?是

我们将证明存在一个不是递归可枚举的语言。

备注

问一下什么是幂集。\(2^{\{a,b\}}, 2^{pos. int.}\)

语言是 \(\Sigma^*\) 的子集。| \(\Sigma\) 上所有语言的集合是 \(2^{\Sigma^*}\) 。
\(\Rightarrow\) \(\Sigma\) 上所有语言的集合 是不可数的。
所有图灵机的集合是可数的。| 因此,递归可枚举语言的集合是可数的。| \(\Rightarrow\) 存在不是递归可 枚举的语言。证毕。

接下来的两个定理与上面的定理一起,将说明存在一些递归可枚举但不递归的语言。

存在 \(M_1\) ,使得 \(M_1\) 能够枚举所有 \(L\) 中的元素。
存在 \(M_2\) ,使得 \(M_2\) 能够枚举所有 \(\bar{L}\) 中的元素。
要确定字符串 \(w\) 是否属于 \(L\) 或不属于 \(L\) ,请执行以下算法:
| 重复直到 \(w\) 匹配 | 枚举 \(M_1\) 中的下一个元素 | 枚举 \(M_2\) 中的下一个元素 | | 如果从 \(M_1\) 中枚举出 \(w\) ,则 \(w\) 属于 \(L\) 。如果从 \(M_2\) 中枚举出 \(w\) ,则 \(w\) 不属于 \(L\) 。
对于每个 \(w \in \Sigma^*\) ,我们可以确定 \(w\) 是否 属于 \(L\) 或不属于 \(L\) 。因此, \(L\) 是递归的。证毕。
\(M'\) 可以判断字符串 \(w\) 是否属于 \(\bar{L}\) 或不属于 \(\bar{L}\) 。
因此, \(\bar{L}\) 是递归的。证毕。

如果 \(L\) 不是递归的,那么 \(L\) 和 \(\bar{L}\) 都不可能是 RE。

语言 \(L = \{ a^i | a^i \in L(M_i) \}\) 是 RE 但不是递归的(因为我们证明了它的补不是 RE)。

语言的层级:

lt25hier2

现在我们将讨论与图灵机表示同一种语言的文法。

备注

还要提到 DCFL(处于正则语言和 CFL 之间),以及 CS(处于 CFL 和 REC 之间)。

定义:如果文法 \(G = (V,T,S,P)\) 的所有产生式都有如下形式,则该文法是 无限制的:

\(u \rightarrow v\)

其中 \(u \in (V \cup T)^+\),\(v \in (V \cup T)^*\)。

对产生式没有任何限制。左端可以有任意多个变元和终结符。

L 是递归可枚举的。| \(\Rightarrow\) 存在一台图灵机 \(M\) 使得 \(L(M) = L\) 。
\(M = (Q, \Sigma, \Gamma, \delta, q_0, B, F)\) | 思路: \(M\) 从 \(w\) 开始,最终到达 一个终态。
\(q_0w \stackrel{*}{\vdash} x_1q_fx_2\) 对某个 \(q_f \in F, x_1, x_2 \in \Gamma^*\)
构造一个无限制文法 \(G\) 使得 \(L(G) = L(M)\) 。
但在 \(G\) 中,文法从 \(S\) 开始并最终 推导出 \(w\) , \(S \stackrel{*}{\Rightarrow}w\)
因此所构造的文法将逆向模拟该图灵机 的过程。
三个步骤:| 1. \(S \stackrel{*}{\Rightarrow} B \ldots B\#xq_fyB\ldots B\) | 对每种可能的组合使用 \(x, y \in \Gamma^*\) | 2. \(B \ldots B\#xq_fyB\ldots B \stackrel{*}{\Rightarrow} B\ldots B\#q_0wB\ldots B\) | 通过遵循逆向模拟转移的规则。| 3. \(B\ldots B\#q_0wB\ldots B \stackrel{*}{\Rightarrow} w\) | 此处只需移除空白符号,并 \(\# q_0\) 。| 下面是所构造的文法。 | \(G = (V,T,S,P)\) | \(T = \Sigma\) | \(V = \{\Gamma - \Sigma\} \cup Q \{\#\} \cup \{S,A\}\) | \(P\) 对应上述三种情况分别为: | 1. 对于 \(S\stackrel{*}{\Rightarrow}B\ldots B\#xq_fyB\ldots B\) | \(S \rightarrow BS \mid SB \mid \#A\) | 将 \(S\) 替换为大量空白符号,最后加上一个 # ` | :math:` A rightarrow aA mid Aa mid q ` | (对每个 :math:` a in Gamma ` 和 :math:` q in F ` )| 然后生成以 终态结尾的符号字符串。
2. 对于 \(B\ldots B\# xq_fyB\ldots B \stackrel{*}{\Rightarrow} B\ldots B\# q_0wB\ldots B\) | 创建逆向模拟图灵机行为的规则。 | 模拟左移和右移。| 对每个 \(\delta(q_i,a) = (q_j,b,R)\) | 向 \(P\) 、 \(bq_j \rightarrow q_ia\) 添加规则 | 对每个 \(\delta(q_i,a)=(q_j,b,L)\) | 向 \(P\) 、 \(q_jcb \rightarrow cq_ia\) 添加规则,针对每个 | \(c \in \Gamma\) 。 | 3. 对于 \(B\ldots B\# q_0wB\ldots B \stackrel{*}{\Rightarrow} w\) | 为了消除 \(\# q_0\) 和空白符号, | \(\# q_0 \rightarrow \lambda\) | \(B \rightarrow \lambda\) | 然后证明 \(S \stackrel{*}{\Rightarrow} w\) 当且仅当 \(q_0w \stackrel{*}{\vdash} x_1q_fx_2\) 对 \(q_f \in F\)

定义:如果文法 \(G\) 的所有产生式都有如下形式,则它是 上下文相关文法:

\(x \rightarrow y\)

其中 \(x,y \in (V \cup T)^{+}\) 且 \(|x|\le |y|\)

可以证明,它们还有另一种等价的定义方式,即所有产生式都有如下形式:

\(xAy \rightarrow xvy\)

这等价于说,\(A \rightarrow v\) 可以在左侧为 \(x\)、右侧为 \(x\) 的上下文中 应用。

定义:如果存在上下文相关文法 \(G\),使得 \(L = L(G)\) 或 \(L = L(G) \cup \{\lambda\}\),则 \(L\) 是上下文相关语言(CSL)。

在文法的定义中,我们不能有 lambda 规则。

我们在这里加上 \(\lambda\),是为了能声称 CFL \(\subset\) CSL。

定理: 对于每一个不包含 \(\lambda\) 的 CSL \(L\) , \(\exists\) 一个 LBA \(M\) 使得 \(L = L(M)\) 。

定理: 如果 \(L\) 被一个 LBA \(M\) 接受,那么存在一个 CSG \(\exists\) \(G\) ,使得 \(L(M) = L(G)\) 。

定理:每个上下文相关语言 \(L\) 都是递归的。

定理:存在一个不是 CSL 的递归语言。

备注

第 11.3 节讨论上下文相关语言(CSL)。这些语言介于上下文无关语言和递归语言之间。 CSL 和 LBA(线性有界自动机)表示同一类语言。

   «  11.1. 归约   ::   目录   ::   11.3. 不可解问题  »

关闭窗口