DFA
定义
(DFA)
确定性有穷状态自动机(Deterministic finite automata,DFA)是一个五元组:
\[M = (Q, \Sigma, \delta, q_0, F)\]
- \(Q\):状态(state)的非空有穷集合
- \(\Sigma\):输入字母表(input alphabet)
- \(\delta\):状态转移函数(transition function)
- \(\delta : Q \times \Sigma \rightarrow Q\)
- \(\delta(q, a) = p\) 表示 \(M\) 在状态 \(q\) 下读入字符 \(a\),则将状态转移到 \(p\) 并将读头指向下一字符串
- \(q_0\):开始状态(initial state),\(q_0 \in Q\)
- \(F\):终止状态(final state)或接受状态(accept state),\(F \subseteq Q\)
用于识别语言时可以用 \(\hat{\delta} : Q \times \Sigma^* \rightarrow Q\)(为了方便起见,后面的 \(\delta\) 都是指 \(\hat{\delta}\)):
\[\hat{\delta}(q, x) = \begin{cases} q, & x = \varepsilon \\ \delta(\hat{\delta}(q, w), a), & x = wa\\ \end{cases}\]
DFA 可以看成具有有穷的状态存储功能。
接受
(DFA 接受)
设 \(M = (Q, \Sigma, \delta, q_0, F)\),对于 \(\forall x \in \Sigma^*\),如果 \(\delta(q_0, x) \in F\),则称 \(x\) 被 \(M\) 接受。
\[ L(M) = \{x | \delta(q_0, x) \in F\} \]
如果 \(L(M_1) = L(M_2)\) 则两个 FA 等价。
即时描述
(即时描述)
设 \(M = (Q, \Sigma, \delta, q_0, F)\),\(x, y \in \Sigma^*\),\(\delta(q_0, x) = q\),则 \(xqy\) 称为 \(M\) 的一个即时描述(instantaneous description, ID),记作
\[ xq_0ay \vdash_M xayqb \]
陷阱状态
DFA 中缺少的边(状态转移)都默认转移到一个陷阱状态(trap)中。陷阱状态只有入边,没有出边,因此 FA 会在这个陷阱状态中读完剩下的字母,并且不会接受这个字符串。
一般可以省略图中的陷阱状态。
NFA
定义
(NFA)
非确定性有穷状态自动机(non-deterministic finite automaton,NFA)
\[M =(Q, \Sigma, \delta, q_0, F)\]
- \(Q, \Sigma, q_0, F\) 的意义与 DFA 相同
- \(\delta: Q \times \Sigma \rightarrow 2^Q\)
- \(\delta(q, a) = \{p_1, p_2, \cdots p_m\} | p_i \subseteq Q\) 表示 \(M\) 在状态 \(q\) 下读入字符 \(a\),可以将状态转移到 \(p_i\) 并指向下一个字符
同样 \(\hat{\delta}\) 的定义也需要扩充:\(\hat{\delta} : Q \times \Sigma^* \rightarrow 2^Q\)
\[\hat{\delta}(q, x) = \begin{cases} \{q\}, & x = \varepsilon \\ \bigcup_{p \in \hat{\delta}(q, w)}\delta(p, a), &x = wa \end{cases}\]
NFA 与 DFA 的区别在于,输入同一个字符可以有多个不同的转移路径。NFA 将 DFA 中的“值”变成了“集合”,此时可以看作是“拥有智能的”DFA,可以自动选择路径。
NFA 上的接受定义
(NFA 接受)
设 \(M = (Q, \Sigma, \delta, q_0, F)\),对于 \(\forall x \in \Sigma^*\),如果 \(\delta(q_0, x) \cap F \ne \emptyset\),则称 \(x\) 被 \(M\) 接受。
\[ L(M) = \{x | \delta(q_0, x) \cap F \ne \emptyset\} \]
DFA 与 NFA 等价
注意:
- 证明两个自动机 \(M, N\) 等价,需要分别证明 \((\forall x \in L(M), x \in L(N)) \wedge \forall x \in L(N), x \in L(M)\)。
- 证明两种自动机(两个语言类)等价,需要分别证明 \((\forall M \in M^*, \exists N \in N^*, L(M) = L(N)) \wedge (\forall N \in N^*, \exists M \in M^*, L(N) = L(M))\)。
DFA 与 NFA 等价
首先,显然 DFA \(\subseteq\) NFA,下面只要证明 NFA \(\subseteq\) DFA。这个证明称为子集构造法。
给定一个 NFA \(M_1 = (Q_1, \Sigma, \delta_1, q_0, F_1)\),下面要构造 DFA \(M_2 = (Q_2, \Sigma, \delta_2, [q_0], F_2)\)。其中 \(Q_2 = 2^{Q_1}\)。
令 \([q_1, q_2, \dots, q_n]\) 表示一个 \(Q_1\) 中的子集,对应了当前同时处于 NFA 上的 \(q_1, q_2, \dots, q_n\) 状态。设在 NFA 上有 \(\delta_1(\{q_1, q_2, \dots, q_n\}, a) = \bigcup_{i=1}^{n}\delta(q_i, a) = \{p_1, p_2, \dots, p_m\}\),则在 DFA 上对应建立转移 \(\delta_2([q_1, q_2, \dots, q_n], a) = [p_1, p_2, \dots, p_m]\)。
接收状态集合 \(F_2 = \{[P \subseteq 2^{Q_1}] | F \cap P \ne \emptyset\}\)。
当有些状态构造出来可能实际上无法从初始状态转移过来时,这些状态可以被删掉。
下面通过归纳 \(|w|\) 证明 \(M_1 = M_2\):
- 基础情况:\(w = \varepsilon\),显然成立
- 归纳:设 \(w = xa\),则
- \(\delta_1(q_0, xa) = \bigcup_{p \in \delta_1(q_0, x)}\delta_1(p, a)\)
- \(\delta_2([q_0], w) = \bigcup_{p \in \delta_2([q_0], x)}\delta_2(p, a)\)
- 由归纳假设知 \(\delta_1(q_0, x) = \delta_2([q_0], x)\),且 \(\forall p \in V, a \in T. \delta_1(p, a) = \delta_2([p], a)\)
在这个构造中用 DFA 的一个点,表示了在 NFA 上“同时处于多个点”的状态,所以 DFA 至多有 \(2^n\) 个点。这个方法的巧妙之处在于尽管 NFA 是不确定性的,但是 NFA 的状态空间是有限的,因此可以用 DFA 构造出 NFA 的所有状态。
\(\varepsilon\)-NFA
定义
(\(\varepsilon\)-NFA)
带空转移的非确定性有穷状态自动机(non-deterministic finite automaton with \(\varepsilon\) moves,\(\varepsilon\)-NFA)
\[M =(Q, \Sigma, \delta, q_0, F)\]
- \(Q, \Sigma, q_0, F\) 的意义与 DFA 相同
- \(\delta: Q \times (\Sigma \cup \{ \varepsilon \}) \rightarrow 2^Q\)
- 对于 \(\delta(q, s) = \{p_1, p_2, \cdots p_m\}\) 表示 \(M\) 在状态 \(q\) 下读入字符 \(a\),则可以将状态转移到 \(p_i\) 并将读头指向下一个字符
- 对于 \(\delta(q, \varepsilon) = \{p_1, p_2, \cdots p_m\}\) 表示 \(M\) 在状态 \(q\) 下不读入字符,并将状态转移到 \(p_i\)
同样 \(\hat{\delta}\) 的定义也需要扩充:\(\hat{\delta} : Q \times \Sigma^* \rightarrow 2^Q, P \subseteq Q, q \in Q, w \in \Sigma^*, a \in \Sigma\)
(闭包)
状态集合 \(P\) 的闭包定义如下:
\[\varepsilon-CL(P)= \begin{cases} \{q \vert p \overset{\varepsilon}{\rightarrow} q \in \delta \}, &P = \{p\} \\ \bigcup_{p \in P} \varepsilon-CL(p), &\text{else} \end{cases}\]
当然 \(\delta(q, \varepsilon) = q\)
则
\[\hat{\delta}(q, x) = \begin{cases} \varepsilon-CL(q), & x = \varepsilon \\ \bigcup_{p \in \hat{\delta}(q, w)}\varepsilon-CL(\delta(p, a)), &x = wa \end{cases}\]
注意在这里 \(\delta(q, \varepsilon) \ne \hat{\delta}(q, \varepsilon)\)。
\(\varepsilon\)-NFA 上的接受定义
(\(\varepsilon\)-NFA 的接受)
设 \(M = (Q, \Sigma, \delta, q_0, F)\),对于 \(\forall x \in \Sigma^*\),如果 \(\hat{\delta}(q_0, x) \cap F \ne \emptyset\),则称 \(x\) 被 \(M\) 接受。
\[ L(M) = \{x | \hat{\delta}(q_0, x) \cap F \ne \emptyset\} \]
NFA 与 \(\varepsilon\)-NFA 等价
NFA 与 \(\varepsilon\)-NFA 等价。
给定一个 \(\varepsilon\)-NFA \(M_1 = (Q, \Sigma, \delta_1, q_0, F_1)\),下面要构造 NFA \(M_2 = (Q, \Sigma, \delta_2, q_0, F_2)\)。
其中
\[ \delta_2(q, a) = \hat{\delta}_1(q, a) \]
\[F_2 = \{q | \varepsilon-CL(q) \cap F_1 \ne \emptyset\}\]
等价性可以通过归纳证明。
由上可知 DFA,NFA,\(\varepsilon\)-NFA 三者两两等价。
正则语言与 FA
RL 与 FA 等价
RL 与 FA 等价。
只要证明 RL \(\subseteq\) FA,且 FA \(\subseteq\) RL 即可。
首先证明 FA 能够接受 RL。需要对于任意 RL,要构造一个与之等价的 FA。对于正则文法 \(G = (V, T, P, S)\),构造 \(M = (V \cup \{Z\}, T, \delta, S, \{Z\})\),其中 \(\delta\) 的定义如下:
\[\delta(A, a) = \begin{cases} \{B | A \rightarrow aB \in P\} \cup \{Z\}, & A \rightarrow a \in P \\ \{B | A \rightarrow aB \in P\} , & A \rightarrow a \notin P \end{cases}\]
下面证明 \(L(M) = L(G)\)。设 \(a_1 a_2 \dots a_n \in L(G)\),即有推导
\begin{aligned} & S \xRightarrow{+} a_1 a_2 \dots a_n \\ \Leftrightarrow& S \Rightarrow a_1 A_1 \Rightarrow a_1 a_2 A_2 \Rightarrow \dots \Rightarrow a_1 a_2 \dots a_n \end{aligned}
因此
\begin{aligned} & S \rightarrow a_1 A_1 \in P \\ & A_1 \rightarrow a_2 A_2 \in P \\ & \dots \\ & A_{n-2} \rightarrow a_{n-1} A_{n-1} \in P \\ & A_{n-1} \rightarrow a_n \in P \end{aligned}
根据此文法,对于 \(\delta\) 有
\begin{aligned} & A_1 \in \delta(S, a_1) \\ & A_2 \in \delta(A_1, a_2) \\ & \dots \\ & A_{n-1} \in \delta(A_{n-2}, a_{n-1}) \\ & Z \in \delta(A_{n-1}, a_n) \end{aligned}
因此 \(Z \in \delta(S, a_1 a_2 \dots a_n)\),成立。
这里需要特殊处理 \(\varepsilon\) 的情况。不妨假设 \(S\) 不出现在任何产生式的右部。设 \(S \rightarrow \varepsilon \in P\),则定义转移 \(\delta(S, \varepsilon) = \{Z\}\),由于 \(S\) 不出现在产生式的右部,因此 FA 上的转移无法回到 \(S\),即这个转移不会对其他句子的接受产生影响。
下面证明 FA 接受的句子都是 RL。由于三种 FA 等价,因此这里只需要证明 DFA 接受的句子是 RL。设 DFA \(M = (Q, \Sigma, \delta, q_0, F)\),构造 \(G = (Q, \Sigma, P, q_0)\),其中
\[P = \{ q \rightarrow a p | \delta(q, a) = p \} \cup \{q \rightarrow a | \delta(q, a) = p \in F \}\]
证明类似。同样这里需要考虑 \(\varepsilon\) 相关的句子。假设 \(q_0 \notin F\),则 \(\varepsilon \notin L(M)\),不影响。如果 \(q_0 \in F\),由于空句子存在与否不影响语言性质,因此存在正则文法 \(G’\) 使得 \(L(G’) = L(G) \cup \{\varepsilon\} = L(M)\)。
综上,命题成立。
左线性文法与 FA 等价
类似 RL 与 FA 等价的证明。只不过 RL 中证明利用了“推导”的顺序,而左线性文法的证明利用了“规约”的顺序。
左线性文法的语言与 FA 等价。
首先证明 FA 能够接受左线性文法的语言。对于左线性文法 \(G = (V, T, P, Z)\),构造 \(M = (V \cup \{S\}, T, \delta, S, \{Z\})\),其中 \(\delta\) 的定义如下:
\[\delta(B, a) = \begin{cases} \{A | A \rightarrow a \in P\} , & B = S \\ \{A | A \rightarrow Ba \in P\} , & B \ne S \end{cases}\]
利用规约可以证明。
然后证明 FA 接受的语言可以用左线性文法描述。对于 DFA \(M = (Q, \Sigma, \delta, q_0, F)\),构造 \(G = (Q, \Sigma, P, q_z)\),其中
\[P = \{ p \rightarrow q a | \delta(q, a) = p \} \cup \{p \rightarrow a | \delta(q_0, a) = p \} \cup \{q_z \rightarrow q a | \delta(q, a) = p \in F \} \]
左右线性文法等价
左右线性文法等价
由于二者皆与 FA 等价,因此二者等价。
FA 的变形
双向 FA
(2DFA)
确定性双向有穷状态自动机(two-way deterministic finite automation, 2DFA)是一个八元组
\[M = (Q, \Sigma, \vdash, \dashv, \delta, q_0, t, r)\]
- 其中 \(Q, \Sigma, q_0, F\) 的意义同 DFA。
- \(\vdash, \dashv\) 分别是起始符号和末尾符号,且 \(\vdash \notin \Sigma \wedge \dashv \notin \Sigma\)
- \(t, r\) 分别是接受状态和拒绝状态,且 \(t \ne r\)
- \(\delta : (Q \setminus \{t, r\}) \times (\Sigma \cup \{\vdash, \dashv\}) \rightarrow Q \times \{L, R\}\)
- 如果 \(\delta(q, a) = \{p, L\}\) 则表示状态转移后讲读头向左移动一个方格,指向前一个字符
- 如果 \(\delta(q, a) = \{p, R\}\) 则表示状态转移后读头向右移动移位,指向下一个字符
- \(\forall q \in Q \setminus \{t, r\}. \delta(q, \vdash) = (p, R)\ (p \in Q)\)
- \(\forall q \in Q \setminus \{t, r\}. \delta(q, \dashv) = (p, L)\ (p \in Q)\)
设 2DFA \[M = (Q, \Sigma, \vdash, \dashv, \delta, q_0, t, r)\],其接受的语言为
\[L(M) = \{x | q_0 x \vdash^{*} xt\}\]
有趣的是,2DFA 也被称为只读图灵机(read-only Turing Machine),因为它长度有限且无法在纸带上打印东西。
2DFA 与 FA 等价。
显然 DFA \(\in\) 2DFA,因此只要证明 \(2DFA \in DFA\).
设 2DFA \[M = (Q_1, \Sigma, \vdash, \dashv, s, \delta_1, t, r)\],下面构造 NFA \(M’ = (Q_2, \Sigma, \delta_2, q_0, F)\)。
注意到 2DFA 的状态仅与读头位置和当前状态相关。
假设目前状态为 \(q\),将需要读入的串 \(x = yz\) 分为两段,2DFA 的读头可以若干次穿越两段的分割点。将其穿越分割点后的状态记录下来,称其为有效穿越序列(valid crossing sequence)。
设有效穿越序列 \(C = q_1 q_2 \dots q_n\) 如果 2DFA 接受这个串,那么:
- 有效穿越序列的长度满足 \(|C| \equiv 1 (\mod 2)\)
- 有效穿越序列的第一个状态一定是向右的,并且后面顺序一定是左右交替,并且最后一次穿越是向右的
- \(\forall q_i, q_j \in C. q_i = q_j \rightarrow |j-i| \equiv 1 (\mod 2)\),即同样的状态在 \(C\) 中的位置不可能同奇同偶
- “同奇同偶”说明读头两次在同一位置出现了重复的状态,说明状态机陷入了循环,这个字符串无法到达终止状态
- 由鸽巢定理,容易知道 \(|C| < 2|Q_1|\),即同一位置的有效穿越序列有限,数量不超过 \(|Q|^{2|Q|}\)
由上面的性质,考虑将当前读头所在位置所对应的有效穿越序列编码为 NFA 的状态。NFA 在某个位置的状态,对应 2DFA 读入这个串后在这个位置留下的有效穿越序列。NFA 的读头只能从左向右移动,每次读入一个字符,然后 NFA 状态会转移到下一个位置的有效穿越序列。当然,由于 2DFA 可能采取不同的路径来回穿越下一个位置,因此下一个位置的有效穿越序列有很多种可能,所以这里需要使用 NFA。
为了能够定义有效穿越序列的匹配,下面首先需要定义左匹配与右匹配。自动机在一个位置上向右运动穿越字符时,前后位置对应的有效穿越序列称为右匹配;反之,称为左匹配。当 2DFA 接受字符串后,每个位置的有效穿越序列的最后一次移动都是向右的,因此此时每个位置和它右侧相邻位置的有效穿越序列构成右匹配。所以 NFA 的状态转移之间需要存在右匹配关系。
设存在两个有效穿越序列 \(C_1 = [p_i], C_2 = [q_j]\),下面针对读头在两个位置和其移动方向进行讨论:
- \(C_1 = \varepsilon, C_2 = \varepsilon\) 互为左右匹配
- 如果 \(C_1\) 是 \(C_2\) 的左匹配,即读头在 \(C_1\) 上,且 \(\delta_1(p_l, a) = (q_k, R)\),那么 \(C_2 q_k\) 是 \(C_1 p_l\) 的右匹配
- 如果 \(C_2\) 是 \(C_1\) 的右匹配,即读头在 \(C_2\) 上,且 \(\delta_1(q_k, a) = (p_l, R)\),那么 \(C_1 p_l\) 是 \(C_2 q_k\) 的左匹配
- 如果 \(C_1\) 是 \(C_2\) 的左匹配,即读头在 \(C_1\) 上,且 \(\delta_1(p_l, a) = (p’, L)\),那么 \(C_1 p_l\) 是 \(C_2\) 的左匹配
- 如果 \(C_2\) 是 \(C_1\) 的右匹配,即读头在 \(C_2\) 上,且 \(\delta_1(q_k, a) = (q’, R)\),那么 \(C_2 q_k\) 是 \(C_1\) 的右匹配
下面是更加严格的定义:
- \(Q_2 = \{C = [q_1 q_2 \dots q_n] | \text{$C$ is a valid crossing sequence for $M$}\}\)
- \(\delta_2([p_i], a) = \{[q_j] | \text{$[q_j]$ right matches $p[l]$} \}\)
- \(q_0 = [s]\)
- \(F = \{[p_i t]\}\)
下面简单证明一下 \(L(M) = L(M’)\)。根据上面的构造显然有 \(L(M) \subseteq L(M’)\);而在 \(M_2\) 中,假设存在 \(\delta_2([p_i], a) = [q_j]\),即 \([q_j]\) 是 \([p_i]\) 右匹配,根据上面对于有效穿越序列匹配的讨论实际上就构建了可以被 \(M\) 所接受的字符串,因此 \(L(M’) \subseteq L(M)\)。
构造完成后,又由于 \(DFA = NFA\),因此有 \(2DFA \in DFA\)。
类似可以定义 2NFA。
带输出的 FA
带输出的 FA 分为两类:Moore 机和 Mealy 机。
(Moore 机)
Moore 机是一个六元组 \(M = (Q, \Sigma, \Delta, \delta, \lambda, q)\):
- \(Q, \Sigma, q_0, \delta\) 的意义同 FA
- \(\Delta\) 是输出字母表
- \(\lambda\) 是输出函数,\(\lambda : Q \rightarrow \Delta\),其中 \(\lambda (q) = a\) 表示在状态 \(q\) 下会输出 \(a\)
(Mealy 机)
Mealy 机是一个六元组 \(M = (Q, \Sigma, \Delta, \delta, \lambda, q)\):
- \(Q, \Sigma, q_0, \delta\) 的意义同 FA
- \(\Delta\) 是输出字母表
- \(\lambda\) 是输出函数,\(\lambda : Q \times \Sigma \rightarrow \Delta\),其中 \(\lambda (q, a) = d\) 表示在状态 \(q\) 下读入 \(a\) 会输出 \(d\)
读入相同的串,moore 机和 mealy 机表现不同:
- Moore 机输出 \(\lambda(q_0) \lambda(q_1) \dots \lambda(q_n)\),长度为 \(n + 1\)
- Mealy 机输出 \(\lambda(q_0, a_1) \lambda(q_1, a_2) \dots \lambda(q_n, a_{n-1})\),长度为 \(n\)
(Moore 机和 Mealy 机的等价性)
对于 moore 机 \(M_1(Q_1, \Sigma, \Delta, \delta_1, \lambda_1, q_{01})\) 和 mealy 机 \(M_2(Q_2, \Sigma, \Delta, \delta_2, \lambda_2, q_{02})\),如果 \(\forall x \in \Sigma^*, T_1(x) = \lambda_1(q_0) T_2(x)\),则称二者等价。
事实上,moore 机的描述能力和 mealy 机是等价的,因此对于任意的机器,可以构造与之等价的另一种机器。
Moore 机与 Mealy 机描述能力等价。
下面给出二者互相转换的思路。
Moore to Mealy:只要将状态前移半个周期即可。设 Moore 机 \(M_1 = (Q, \Sigma, \Delta, \delta, \lambda_1, q)\),令 Mealy 机 \(M_2 = (Q, \Sigma, \Delta, \delta, \lambda_2, q)\),其中
\[\forall x : \Sigma, \delta(p, x) = q \wedge \lambda_1(q) = a \rightarrow \lambda(p, x) = a \]
Mealy to Moore:考虑将每种转移来的路径对应到一个状态,用 \([p, q, x]\) 表示从 \(p\) 转移到 \(q\),造成转移读取的字符为 \(x\)。令 Mealy 机为 \(M_1 = (Q_1, \Sigma, \Delta, \delta_1, \lambda_1, q)\),Moore 机为 \(M_2 = (Q_2, \Sigma, \Delta, \delta_2, \lambda_2, q)\),则
- \(Q_2 = \{ [p, q, x] | \delta_1(p, q) = x, p \in Q_1, q \in Q_1 \}\)
- \(\forall p : \delta(p, x) = q. \forall r : \delta(q, y) = r. \delta([p, q, x], y) = [q, r, y]\)
- \(\forall [p, q, x] \in Q_2, \lambda_2([p, q, x]) = \lambda_1(p, x)\)
一个有趣的题
定义语言 \(L\) 上的运算 \(\operatorname{\mathrm{Hlf}}\) 为 \(\operatorname{\mathrm{Hlf}}(L) = \{x | \exists y. |x| = |y| \wedge xy \in L\}\)。
证明 RL 对于 \(\operatorname{\mathrm{Hlf}}\) 封闭。
不妨设 RL \(L\) 对应 DFA \(M(Q, \Sigma, \delta, q_0, F)\),现构造一个 FA \(M’(Q \cup \{q_0’\}, \Sigma, \delta’, q_0’, \emptyset)\),其中
\[\delta’(q, \varepsilon) = \begin{cases} F, & q = q_0’ \\ \{ p | \exists b \in \Sigma. \delta(p, b) = q \}, & q \in Q \end{cases}\]
即 \(M’\) 是一个从 \(M\) 的终态集开始与 \(M\) 逆向运动的状态机。下面用这两个状态机来联合构造一个 FA \(M’’(Q \times 2^Q, \Sigma, \delta’’, [q_0, F], F’’)\),其中
- \(F’’ = \{[q, q] | q \in Q\}\)
- \(\delta’’([q, p], a) = \{[s, t] | \delta(q, a) = s \wedge t \in \delta’(p, a)\}\)
\(M’’\) 的状态有两个分量,第一个分量表示 \(M\) 的运动,即对于 \(x\) 的构造;第二个分量表示 \(M’’\) 的运动,即对于 \(y\) 的构造。由于每次转移两个分量都需要走一步,因此 \(|x| = |y|\)。当两个分量的状态相遇时,满足 \(xy \in L\)。