Loading

计算理论导论(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\),并且满足:

    1. 对每个 \(i \geq 0\)\(xy^i z \in A\)

    2. \(|y| > 0\)

    3. \(|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)\),其中:

  1. \(V\) 是一个叫做变量(variables)的有限集合。

  2. \(\Sigma\) 是一个和 \(V\) 不相交的有限集合,叫做终结符(terminals)集合。

  3. \(R\) 是一个规则(rules)的有限集,每条规则把一个变量映射成一个变量和终结符的字符串。

  4. \(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\) 满足:

  1. \(s_0 = q_0\) 并且 \(t_0 = \epsilon\)

  2. 对于 \(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^*\)

  3. \(s_m \in F\)

例如,下面的语言可以被 PDA 识别

  1. \(\{0^n 1^n \mid n \in \mathbb{N}^+\}\)

  2. \(\{ww^\mathcal{R} \mid w \in \{0, 1\}^*\}\)

我们有如下定理:

  • 一个语言是上下文无关语言,当且仅当存在一个下推自动机识别它,当且仅当存在一个上下文无关文法生成它。

对于一个 CFG,用一个栈维护当前的表达式,每次取出栈顶展开之后逆序塞入栈里,如果读到终结符就读入一个输入看是否匹配。

对于一个 PDA,我们可以很简单地修改 PDA 使得接受状态只有一个,且最后栈弹空,且栈只存在加入和删除,不存在替换。

\[P = (Q, \Sigma, \Gamma, \delta, q, \{q_a\}), \quad G = (V, \Sigma, R, S), \quad 取 V = \{A_{p,q} | p, q \in Q\}, \quad 取三条规则。 \]

  1. \(\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\)

  2. \(\forall p, q, r \in Q\),加入规则 \(A_{p,q} \Rightarrow A_{p,r}A_{r,q}\)

  3. \(\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\),并且满足:
  1. 对每个 \(i \geq 0\)\(uv^i xy^i z \in A\)

  2. \(|vy| > 0\)

  3. \(|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\),满足:

  1. \(|xy| \leq p\)
  2. \(|y| \geq 1\)
  3. 对于所有 \(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\),满足:

  1. \(|xy| \leq p\)

  2. \(|y| \geq 1\)

  3. 对于所有 \(i \geq 0\),字符串 \(xy^i z\) 也属于 \(B_3(A)\)

\(n_i = (xy^i z)_{10}\),则

\[(n_{k+1} - n_k) = (n_2 - n_1)3^{|y|(k-1)} \]

\(n_k = 2^{r_k}\),其中 \(r_k < r_{k+1}\),则

\[(2^{r_{k+1}} - 2^{r_k}) = (2^{r_2} - 2^{r_1})3^{|y|(k-1)} \]

所以

\[(2^{r_{k+1} - r_1} - 2^{r_k - r_1}) = (2^{r_2 - r_1} - 1)3^{|y|(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 $ 可被划分为五个部分

\[s = uvxyz \]

满足:

  1. $ |vxy| \leq p $
  2. $ |vy| \geq 1 $(即 $ v $ 和 $y $ 不同时为空)
  3. 对所有 $ 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\}\) 显然是正则语言,且是无限大的,证毕。

posted @ 2026-06-22 19:43  Larunatrecy  阅读(18)  评论(0)    收藏  举报