计算理论导论(1):自动机
自动机 Automata
确定性有限状态自动机 DFA
确定性有限状态自动机(DFA)由状态集合 \(Q\),字符集 \(\Sigma\),转移函数 \(\delta:Q\times \Sigma \to Q\),初始状态 \(q_0\),接收状态 \(F\subseteq Q\) 构成。
称机器 \(M\) 接受字符串 \(w_1w_2\cdots w_n\),当且仅当存在状态序列 \(q_0,q_1\cdots q_n\),使得 \(q_0\) 为初始状态,\(\delta(q_{i-1},w_i)=q_i,q_n\in F\)。
称 \(M\) 接受的所有字符串的集合 \(A\) 为 \(M\) 的语言,记作 \(L(M)=A\)。
DFA 的转移函数应可以接受所有字符作为输入。
正则语言 Regular Languages
对于某个语言 \(A\),如果存在某个 DFA \(M\) 使得 \(L(M)=A\),称 \(A\) 是正则语言。
正则语言在有限次集合运算下是封闭的,具体来说,令 \(A,B\) 是正则语言,\(L(M_A)=A,L(M_B)=B\):
-
\(A \cup B,A\cap B\),令 \(M\) 的状态为 \(Q_A,Q_B\) 的笛卡尔积,接收状态为 \(F_A\cup F_B,F_A\cap F_B\) 即可。
-
\(A\) 的补 \(A^c\) 只需要将接收状态和其他状态取反即可。
-
\(A^k,A^*\) 这里表示 \(A\) 的拼接,显然前者把自动机拼有限次即可,后者可以连一个环出来(这里可能用 NFA 的 \(\varepsilon\) 边更方便)。
非确定性有限状态自动机 NFA
非确定性有限状态自动机(NFA)由状态集合 \(Q\),字符集 \(\Sigma\) ( 记 \(\Sigma_{\varepsilon}=\Sigma \cup \{\varepsilon\)}),转移函数 \(\delta:Q\times \Sigma_{\varepsilon} \to P(Q)\),初始状态 \(q_0\),接收状态 \(F\subseteq Q\) 构成,其中 \(P(·)\) 为幂集,即转移边可以转移到多个状态。
称 NFA \(M\) 接受 \(w_1w_2\cdots w_n\) 当且仅当可以在 \(w\) 中加入若干 \(\varepsilon\) 形成 \(w_1w_2\cdots w_m\),且存在状态序列 \(q_0,q_1\cdots q_m\),使得 \(q_0\) 为起始状态,\(q_m\in F\),\(q_{i}\in \delta(q_{i-1},w_i)\)。
- NFA 和 DFA 在计算能力上是等价的。
一方面,显然 DFA 是 NFA。
另一方面,直接令 \(Q'\) 为 \(Q\) 的幂集,其中每个状态代表 NFA 中每个状态是否可达,对 \(S\in P(Q)\), 记 \(E(S)\) 为 \(S\) 内结点可以沿着 \(\varepsilon\) 边到达的状态集合,令转移函数 \(\delta'(S,a)=\bigcup\limits_{q\in S}E(\delta(q,a)),F'\) 为所有包含 \(\in F\) 状态的 \(S\),\(q_0'=E(q_0)\),显然得到了一个语言和原本 NFA 相同的有限 DFA。
正则表达式 Regular Expressions
称一个表达式 \(R\) 是正则表达式当且仅当满足下面之一:
-
单个字符 \(a,a\in \Sigma\)。
-
\(\varepsilon\)
-
\(\empty\)
-
\(R=R_1\cup R_2\),其中 \(R_1,R_2\) 为正则表达式。
-
\(R=R_1\circ R_2\),其中 \(\circ\) 为拼接。
-
\(R=R_1^*\)。
我们有 Kleene 定理(Kleene's Theorem
- 一个语言正则当且仅当存在正则表达式描述它。
从正则表达式构造 NFA 是显然的。
而从 DFA 构造正则表达式可以考虑每次删点,边的连接就是 \(\circ\),消掉重边就是 \(\cup\)。
泵引理 Pumping Lemma
-
Pumping Lemma:若 \(A\) 是正则语言,则存在一个数 \(p\),使得如果 \(s\) 属于 \(A\) 且长度 \(\geq p\),那么 \(s\) 可以被切成 3 段 \(s = xyz\),并且满足:
-
对每个 \(i \geq 0\),\(xy^i z \in A\)
-
\(|y| > 0\)
-
\(|xy| \leq p\)
-
显然因为 DFA 只有有限状态,足够长的字符串一定会经过重复结点,则形成了一个环,重复这个环即可。
可以利用 Pumping Lemma 可以证明下面的语言不是正则的。
-
\(B = \{0^n 1^n \mid n \geq 0\}\)
-
\(C = \{w \mid w \text{ 中 0 和 1 的数量相等}\}\)
-
\(F = \{ww \mid w \in \{0, 1\}^*\}\)
-
\(D = \{1^{n^2} \mid n \geq 0\}\)
-
\(E = \{0^i 1^j \mid i > j\}\)
上下文无关语言 Context-Free Languages
上下文无关语法是一个四元组 \((V, \Sigma, R, S)\),其中:
-
\(V\) 是一个叫做变量(variables)的有限集合。
-
\(\Sigma\) 是一个和 \(V\) 不相交的有限集合,叫做终结符(terminals)集合。
-
\(R\) 是一个规则(rules)的有限集,每条规则把一个变量映射成一个变量和终结符的字符串。
-
\(S \subseteq V\) 是开始变量。
令 \(u, v, w\) 是变量和终止符组成的字符串,如果 \(A \to w\) 是该语法的一条规则,那么我们称 \(uAv\) 可以产生(yields)\(uwv\) 记作 \(uAv \Rightarrow uwv\)。
称 \(u\) 可以产生(derives)\(v\),同样记作 \(u \Rightarrow v\),当 \(u = v\) 或者存在序列 \(u_1, u_2, \ldots, u_k (k \geq 0)\) 且 \(u_1 \Rightarrow u_2 \Rightarrow \cdots \Rightarrow v\)。
那么所有可以由 \(S\) 产生的字符串集合称作该语法的语言。
下推自动机 Pushdown Automata
下推自动机由六元组 \((Q, \Sigma, \Gamma, \delta, q_0, F)\) 组成,其中\(Q\) 为状态集,\(\Sigma\) 为输入字符集,\(\Gamma\) 为栈字符集,转移函数 \(\delta: Q \times \Sigma_\epsilon \times \Gamma_\epsilon \to \mathcal{P}(Q \times \Gamma_\epsilon)\),\(q_0 \in Q\) 起始状态,\(F \subseteq Q\) 接受状态集。
一个字符串 \(w\) 可以被下推自动机 \(M = (Q, \Sigma, \Gamma, \delta, q_0, F)\) 接受当 \(w\) 可以被视作 \(w_1, w_2, \ldots, w_m\)(\(w_i \in \Sigma_\epsilon\)),并且存在序列 \(s_0, s_1, s_2, \ldots, s_m\) 和字符串序列 \(t_0,t_1, t_2, \ldots, t_m\) 满足:
-
\(s_0 = q_0\) 并且 \(t_0 = \epsilon\)。
-
对于 \(i = 0, 1, \ldots, m-1\),满足 \((s_{i+1}, b) \in \delta(s_i, w_{i+1}, a)\),其中 \(t_i = ar\),\(t_{i+1} = br\) 并且 \(a, b \in \Gamma_\epsilon\),\(r \in \Gamma^*\)。
-
\(s_m \in F\)。
例如,下面的语言可以被 PDA 识别
-
\(\{0^n 1^n \mid n \in \mathbb{N}^+\}\)
-
\(\{ww^\mathcal{R} \mid w \in \{0, 1\}^*\}\)
我们有如下定理:
- 一个语言是上下文无关语言,当且仅当存在一个下推自动机识别它,当且仅当存在一个上下文无关文法生成它。
对于一个 CFG,用一个栈维护当前的表达式,每次取出栈顶展开之后逆序塞入栈里,如果读到终结符就读入一个输入看是否匹配。
对于一个 PDA,我们可以很简单地修改 PDA 使得接受状态只有一个,且最后栈弹空,且栈只存在加入和删除,不存在替换。
-
\(\forall p, q, r, s \in Q, u \in \Gamma, a, b \in \Sigma_\epsilon\),若 \(\delta(p, a, \epsilon) \ni (r, u)\),\(\delta(s, b, u) \ni (q, \epsilon)\),加入规则 \(A_{p,q} \Rightarrow aA_{r,s}b\)。
-
\(\forall p, q, r \in Q\),加入规则 \(A_{p,q} \Rightarrow A_{p,r}A_{r,q}\)。
-
\(\forall p \in Q\),加入规则 \(A_{p,p} \Rightarrow \epsilon\)。
取 \(S = A_{q,q_a}\)。
同样的,我们有 CFL 的泵引理(Pumping Lemma ):
- 若 \(A\) 是上下文无关语言,则存在一个数 \(p\),使得如果 \(s\) 属于 \(A\) 且长度 \(\geq p\),那么 \(s\) 可以被切成 5 段 \(s = uvwxyz\),并且满足:
-
对每个 \(i \geq 0\),\(uv^i xy^i z \in A\)
-
\(|vy| > 0\)
-
\(|vxy| \leq p\)
利用 Pumping 引理可以证明 \(\{a^nb^nc^n|n\in N\}\) 不是上下文无关语言。
练习题
- 对于任意字符串 \(w = w_1w_2\cdots w_n\),\(w\) 的反转记为 \(w^R\),即 \(w^R = w_n\cdots w_2w_1\)。对于任意语言 \(A\),定义 \(A^R = \{w^R \mid w \in A\}\)。证明:若 \(A\) 是正则语言,则 \(A^R\) 也是正则语言。
Answer.
直接反转 NFA 的边即可。
-
对于语言 \(A\),定义两个字符串之间的等价关系:\(x \equiv y\) 表示
\[\forall z \in \Sigma^* : xz \in A \iff yz \in A. \]这允许将 \(\Sigma^*\) 划分为不同的等价类。
例如,若 \(A = \{w \mid w \text{ 包含偶数个 0 且至多一个 1}\}\),则:
\[11 \equiv 1111, \quad 10 \equiv 01, \quad \text{但} \quad 000 \not\equiv 0001. \](a) 在上述例子中,\(A\) 有多少个不同的等价类?
(b) 证明:对于每个正则语言 \(A\),\(\Sigma^*\) 可以划分为有限个等价类。
(c) 证明:若对于语言 \(A\),\(\Sigma^*\) 可以划分为有限个等价类,则 \(A\) 是正则语言。
(d) 利用以上结论,证明 \(A = \{0^n1^n \mid n \in \mathbb{N}\}\) 不是正则语言。
Answer.
(a) \(5\)。
(b) 建立出可以接受正则语言 \(A\) 的 DFA,则对于 \(x \in \Sigma^*\),可以求出 \(x\) 在 DFA 上沿着转移边走到的结点 \(p(x)\),则对于 \(x, y \in \Sigma^*\),如果 \(p(x) = p(y)\),后续怎么走肯定也都一样,因此一定属于一个等价类,而最多只有 \(|Q|\) 个不同的 \(p\),DFA 状态数 \(|Q|\) 肯定是有限的,所以只会有有限个等价类。
(c) 如果 \(\Sigma^*\) 可以被划分为有限个等价类 \(S_1, S_2, \ldots, S_k\),可以建立一个 \(|Q| = k\) 个状态的 DFA,分别对应 \(k\) 个等价类。
因为如果 \(x\) 和 \(y\) 属于同一个等价类,\(x \in A \Leftrightarrow y \in A\),因此一个等价类是接收状态当且仅当该等价类有 \(\in A\) 的串。
因为如果 \(x, y\) 属于同一个等价类,则 \(\forall a \in \Sigma, z \in \Sigma^*\),\(xaz \in A \Leftrightarrow yaz \in A\),所以 \(xa \equiv ya\),因此一个等价类 \(S_i\) 来说,取任意 \(x \in S_i\),\(\delta(S_i, a)\) 为 \(xa\) 所在的类即可。
起始结点设置为包含空串 \(\epsilon\) 的串即可。
显然该 DFA 可以接受 A。
(d) 若 \(A = \{0^n1^n \mid n \in \mathbb{N}\}\) 是正则语言,则 \(\Sigma^*\) 可以划分为有限个等价类,考虑 \(0^n\) 和 \(0^m\)(\(n < m\)),因为 \(0^n1^n \in A\) 但是 \(0^m1^n \notin A\),所以 \(0^n, 0^m\) 不在同一等价类,因此 \(\forall n \in \mathbb{N}\),\(0^n\) 在不同的等价类里,因此有无限个等价类,矛盾。
- 设 \(A/B = \{x \mid \exists y \text{ 使得 } xy \in A \text{ 且 } y \in B\}\)。证明:若 \(A\) 是正则语言且 \(B\) 是任意语言,则 \(A/B\) 是正则语言。
Answer.
设 \(M = (Q, \Sigma, \delta, q_0, S)\) 是识别 \(A\) 的 DFA,\(T = \{q \in Q \mid \exists y \in B, \delta(q, y) \in S\}\)。
则令 \(M' = (Q, \Sigma, \delta, q_0, T)\),\(x \in L(M') \Leftrightarrow \delta(q_0, x) \in T \Leftrightarrow \exists y, \delta(q_0, xy) \in S \Leftrightarrow \exists y \in B, xy \in A \Leftrightarrow x \in A/B\)。
所以 \(M'\) 是识别 \(A/B\) 的 DFA,\(A/B\) 是正则语言。
-
证明以下语言不是正则语言。
(a) \(\{w \in \Sigma^* \mid |w| \text{ 是平方数}\}\)。
(b) \(\{0^m1^n \mid m, n > 0 \text{ 且 } \gcd(m, n) = 1\}\)。
Answer.
(a)
由泵引理,若 \(A\) 是正则语言,则存在一个常数 \(p > 0\),使得对于 \(A\) 中任意一个长度不小于 \(p\) 的字符串 \(s\),都可以将 \(s\) 写成 \(s = xyz\),满足:
- \(|xy| \leq p\)
- \(|y| \geq 1\)
- 对于所有 \(i \geq 0\),字符串 \(xy^i z\) 也属于 \(A\),即设 \(t = |y| \leq p\),\(n = |xyz|\),则 \(n, n+t, n+2t, \dots\) 都是平方数。取 \(n = p^2\),令 \(n + t = (p + r)^2 = p^2 + 2pr + r^2\),所以 \(t = 2pr + r^2 > p\),与 \(t \leq p\) 矛盾,因此 \(A\) 不是正则语言。
(b)
由第三题结论,若 A 是正则语言,则可以根据 \(x \equiv y \Leftrightarrow (\forall z, xz \in A \Leftrightarrow yz \in A)\) 的等价关系分成有限个等价类。
考虑 \(0^{p_1}, 0^{p_2}\),\(p_1, p_2\) 是不同的素数,则 \(0^{p_1}1^{p_1} \notin A\) 且 \(0^{p_2}1^{p_1} \in A\)(因为 \(\gcd(p_2, p_1) = 1\)),所以 \(0^{p_1}\) 和 \(0^{p_2}\) 属于不同等价类,因此不同素数属于不同等价类,因为素数有无穷个,因此有无穷个等价类,因此 A 不是正则语言。
-
\(A\) 是自然数的一个子集,\(k > 1\) 是一个自然数。定义
\[B_k(A) = \{w \mid w \text{ 是 } A \text{ 中某个元素的 } k \text{ 进制表示(无前导零)}\}. \]例如,
\[B_2(\{3, 5\}) = \{11, 101\}, \quad B_3(\{3, 5\}) = \{10, 12\}. \]给出一个集合 \(A\),使得 \(B_2(A)\) 是正则语言但 \(B_3(A)\) 不是正则语言,并证明你的例子是正确的。
Answer.
考虑 \(A = \{2^n \mid n \in \mathbb{N}\}\),则显然 \(B_2(A) = \{10^n \mid n \in \mathbb{N}\}\) 是正则语言。
现在只需要证明 \(B_3(A)\) 不是正则语言,还是考虑反证,若 \(B_3(A)\) 是正则语言,由泵引理,存在一个常数 \(p > 0\),使得对于 \(B_3(A)\) 中任意一个长度不小于 \(p\) 的字符串 \(s\),都可以将 \(s\) 写成 \(s = xyz\),满足:
-
\(|xy| \leq p\)
-
\(|y| \geq 1\)
-
对于所有 \(i \geq 0\),字符串 \(xy^i z\) 也属于 \(B_3(A)\)。
设 \(n_i = (xy^i z)_{10}\),则
设 \(n_k = 2^{r_k}\),其中 \(r_k < r_{k+1}\),则
所以
左边是偶数,右边是奇数,显然不等,因此矛盾,\(B_3(A)\) 不是正则语言。
-
假设 \(A, B \subseteq \Sigma^*\) 是两个语言,且 \(A\) 是上下文无关的。证明或反驳(给出反例)以下陈述:
(a) 若 \(B\) 是上下文无关的,则 \(A \cap B\) 是否一定是上下文无关语言?
(b) 若 \(B\) 是正则的,则 \(A \cap B\) 是否一定是上下文无关语言?
Answer.
(a) 如果 \(A,B\) 都是上下文无关语言,那么 \(A\cap B\) 不一定是上下文无关语言。
令 \(A=\{a^nb^nc^m|n,m\in \N\}\),\(B=\{a^nb^mc^m|n,m\in \N\}\)。
A 可以由下面的上下文无关文法 \((V,\Sigma,R,S)\) 生成:
- \(V=\{S_0,S,C\}\),\(\Sigma=\{a,b,c\}\),起始状态是 \(S_0\)。
- 生成式包括 \(S_0\to SC,S\to aSb|\varepsilon,C\to cC|\varepsilon\)
显然生成了 \(A\),\(B\) 同理,那么 \(A\cap B=\{a^nb^nc^n|n\in \N\}\),显然由 Pumping Lemma 这个不是上下文无关的。
(b)若 \(A\) 是上下文无关语言,\(B\) 是正则语言,则 \(A\cap B\) 一定是上下文无关语言。
设 \(A\) 可以被下推自动机 \((Q,\Sigma,\Gamma,\delta,q_0,F)\) 识别,\(B\) 可以被 NFA \((Q',\Sigma,\delta',q_0',F')\) 表示。
考虑下推自动机 \((Q'',\Sigma,\Gamma,\delta'',q_0'',F'')\),其中
- \(Q''=Q\times Q'\) 即二者的笛卡尔积,每个状态可以表示为 \((q_i,q_j')\),其中 \(q_i\in Q,q_j'\in Q'\)。
- \(\delta'':Q''\times \Sigma\times \Gamma\to P(Q''\times \Gamma)\),\(((q_k,q_l'),b)\in \delta''((q_i,q_j'),w,a)\) 当且仅当 $ (q_k,b)\in \delta(q_i,w,a)$ 且 $ q_l'\in \delta'(q_j',w)$。
- \(q_0''=(q_0,q_0')\)。
- \((q_i,q_j')\in F''\) 当且仅当 \(q_i\in F\) 且 \(q_j'\in F'\)。
那么显然可以识别 \(A\cap B\)。
- 一个语言 \(C \subseteq \Sigma^*\) 被称为前缀封闭(prefix-closed),若 \(xy \in C\) 蕴含 \(x \in C\)。假设 \(C\) 是无限上下文无关语言且前缀封闭。证明存在一个无限正则语言 \(R\),使得 \(R \subseteq C\)。
Answer.
因为 \(C\) 是上下文无关语言,则由 Pumping Lemma 存在常数 $ p > 0 $,使得对任意长度 $|s| \geq p $ 的字符串 $s \in C \(,\) s $ 可被划分为五个部分
满足:
- $ |vxy| \leq p $
- $ |vy| \geq 1 $(即 $ v $ 和 $y $ 不同时为空)
- 对所有 $ i \geq 0 $,有 $ uv^i x y^i z \in L_2$
因为 \(C\) 是无限的,所以一定至少能找到一个长度 \(\geq p\) 的字符串 \(s=uvxyz\),且 \(\forall i\geq 0,uv^ixy^iz\in C\)。又因为 \(C\) 是 prefix-closed ,所以 \(uv^i\in C\),而 \(L'=\{uv^i|i\geq 0\}\) 显然是正则语言,且是无限大的,证毕。

浙公网安备 33010602011771号