[计算理论基础] 有穷自动机

计算理论基础课程总结

Posted by Nicodechal on 2018-01-06

确定性有穷自动机

定义2.1:确定性有穷自动机

M=(Q,Σ,δ,q0,F)M=(Q,\Sigma, \delta, q_0, F)

其中:

  • QQ:有穷状态集
  • Σ\Sigma: 输入字母表
  • δ:Q×Σ→Q\delta: Q \times \Sigma \to Q: 转移函数
    扩展的转移函数:δ:Q×Σ∗→Q\delta: Q \times \Sigma^* \to Q
  • q0∈Qq_0 \in Q: 初始状态
  • F⊆QF\subseteq Q: 接受状态
  • L(M)={w∈Σ∗∣δ(q0,w)∈F}L(M) = \{w\in \Sigma^*|\delta(q_0, w)\in F\} 为正则语言

正则运算

设 AA,BB 为两个语言,正则运算为:

  • 并 A∪BA\cup B
  • 连接 ABAB
  • 星号 A∗A^*

定理:正则语言对正则运算封闭


定理:正则语言对补运算封闭
思路:证明补运算产生的语言和原来的语言互补
证明:设正则语言L=L(M)L=L(M),
M=(Q,Σ,δ,q0,F)M=(Q,\Sigma, \delta, q_0, F),令F′=Q−FF'=Q-F.
M′=(Q,Σ,δ,q0,F′)M'=(Q,\Sigma, \delta, q_0, F').
∀x,x∈L(M)⇔δ(q0,x)∈F⇔δ(q0,x)∉F′⇔x∉L(M′) \forall x, x\in L(M) \Leftrightarrow \delta(q_0,x)\in F \Leftrightarrow \delta(q_0,x)\notin F' \Leftrightarrow x \notin L(M') (证明互补)
所以 L(M′)=Σ∗−L(M)=L(M)cL(M')=\Sigma^*-L(M) = L(M)^c


定理2.12:正则语言对并运算封闭
思路:让两个自动机同时运行只要一个接受就接受
证明:设正则语言Li=L(Mi)L_i=L(M_i),
M=(Qi,Σi,δi,qi,Fi),i=1,2M=(Q_i,\Sigma_i, \delta_i, q_i, F_i), i=1,2.
Q3=Q1×Q2;q3=(q1,q2)Q_3=Q_1\times Q_2; q_3=(q_1,q_2);
δ3((r1,r2),a)=(δ1(r1,a),δ2(r2,a))\delta_3((r_1,r_2), a)=(\delta_1(r_1,a),\delta_2(r_2,a))
F3=(F1×Q2)∪(Q1×F2)F_3=(F_1\times Q_2)\cup (Q_1\times F_2).(F为接受状态,只要一个FiF_i接受即可)
M3=(Q3,Σ3,δ3,q3,F3)M_3=(Q_3,\Sigma_3, \delta_3, q_3, F_3).
L1∪L2=L(M1)∪L(M2)=L(M3)L_1\cup L_2=L(M_1)\cup L(M_2)=L(M_3)

NFA证明:设 NFA Ni=(Qi,Σ,δi,qi,Fi)N_i=(Q_i,\Sigma, \delta_i, q_i, F_i) 识别 Ai,i=1,2A_i,i=1,2 构造 NFA N 识别 A1∪A2A_1\cup A_2
Q=Q1∪Q2∪{q0}Q=Q_1\cup Q_2 \cup \{q_0\}
F=F1∪F2F=F_1\cup F_2
δ(q,a)={δ1(q,a)q∈Q1δ2(q,a)q∈Q2{q1,q2}q=q0∧a=ϵ∅q=q0∧a≠ϵ \delta(q,a)=\left\{\begin{array}{ll} \delta_1(q,a) & q\in Q_1 \\ \delta_2(q,a) & q\in Q_2 \\ \{q_1,q_2\} & q=q_0\wedge a = \epsilon \\ \emptyset & q=q_0\wedge a \neq \epsilon \end{array}\right.


定理:正则语言对交运算封闭
思路:1. 布尔运算(交并补)转为之前的问题。 2. 让两个自动机同时运行只要都接受就接受
证明:设正则语言Li=L(Mi)L_i=L(M_i),
M=(Qi,Σi,δi,qi,Fi),i=1,2M=(Q_i,\Sigma_i, \delta_i, q_i, F_i), i=1,2.
Q3=Q1×Q2;q3=(q1,q2)Q_3=Q_1\times Q_2; q_3=(q_1,q_2);
δ3((r1,r2),a)=(δ1(r1,a),δ2(r2,a))\delta_3((r_1,r_2), a)=(\delta_1(r_1,a),\delta_2(r_2,a))
F3=F1×F2F_3=F_1\times F_2.(F为接受状态,两个FiF_i都接受)
M3=(Q3,Σ3,δ3,q3,F3)M_3=(Q_3,\Sigma_3, \delta_3, q_3, F_3).
L1∩L2=L(M1)∩L(M2)=L(M3)L_1\cap L_2=L(M_1)\cap L(M_2)=L(M_3)

推论:正则语言对布尔运算、差、对称差封闭


定理2.13:正则语言对连接运算封闭
思路:对于两个自动机 AA 和 BB,一直运行 AA 直到所有串输入,过程中,当 AA出现接受状态时,同步启动一个 BB 运行,最终根据是否有 BB 达到接受状态决定是否接受输入串。
证明:略。

NFA证明:
Q=Q1∪Q2Q=Q_1\cup Q_2
δ(q,a)={δ1(q,a)q∈Q1,a∉F1δ1(q,a)q∈F1,a≠ϵδ1(q,a)∪{q2}q∈F1,a=ϵδ2(q,a)q∈Q2 \delta(q,a)=\left\{\begin{array}{ll} \delta_1(q,a) & q\in Q_1,a\notin F_1 \\ \delta_1(q,a) & q\in F_1,a\neq \epsilon \\ \delta_1(q,a)\cup \{q_2\} & q\in F_1,a = \epsilon \\ \delta_2(q,a) & q\in Q_2 \end{array}\right.


定理2.24:正则语言对星号运算封闭
思路:类似于定理2.13,初始状态集{q0}\{q_0\},当第一个自动机出现接受状态 qfq_f 时,启动第二个自动机,并从当前输入开始运行所有自动机,状态集为 {qf,q0}\{q_f, q_0\} 当两个自动机中任一个出现接受状态则启动一个新的自动机,并从当前输入开始继续运行所有自动机 ( 例如,{qx,qf,q0}\{q_x, q_f, q_0\} ),最终根据自动机状态集合中是否出现接受状态而接受。

NFA证明:
Q=Q1∪{q0}Q=Q_1\cup \{q_0\}
F=F1∪{q0}F=F_1\cup \{q_0\}
δ(q,a)={δ1(q,a)q∈Q1,a∉F1δ1(q,a)q∈F1,a≠ϵδ1(q,a)∪{q1}q∈F1,a=ϵ{q1}q=q0,a=ϵ∅q=q0,a≠ϵ \delta(q,a)=\left\{\begin{array}{ll} \delta_1(q,a) & q\in Q_1,a\notin F_1 \\ \delta_1(q,a) & q\in F_1,a \neq \epsilon \\ \delta_1(q,a)\cup \{q_1\} & q\in F_1,a = \epsilon \\ \{q_1\} & q=q_0,a=\epsilon \\ \emptyset & q=q_0,a\neq \epsilon \end{array}\right.

非确定性有穷自动机

特点:下一个状态可以不唯一确定:

  • ϵ\epsilon 移动或每一步有多个选择,产生不同的备份
  • 无法移动备份消失
  • 一个备份接受则接受
  • 自动机描述简单,减少状态数,分析麻烦

NFA 与 DFA 的等价性

ϵ\epsilon 闭包:每个状态子集合,经 ϵ\epsilon 移动可以达到的新状态子集合。


定理2.19:每台 NFA 都有等价 DFA
思路:给定NFA,构造 DFA 记住 NFA 的所有分支,设有 k 个状态则有 2k2^k 个不同状态子集合。
证明:设 NFA N=(Q,Σ,δ,q0,F)N=(Q,\Sigma,\delta,q_0,F),
构造 DFA M(Q′,Σ,δ′,q0′,F′)M(Q',\Sigma,\delta',q_0',F'),L(M)=L(N)L(M)=L(N)

  • Q′=P(Q)Q'=P(Q),原来状态的幂集
  • δ′(R,a)=⋃r∈RE(δ(r,a))\delta'(R, a)=\bigcup_{r\in R}E(\delta(r,a)), E 为 ϵ\epsilon 闭包,从一个ϵ\epsilon闭包转移到另一个ϵ\epsilon闭包
  • q0′=E({q0})q_0'=E(\{q_0\})
  • F′={R∈Q′∣R∩F≠∅}F'=\{R\in Q'|R\cap F\neq \emptyset\}

推论2.20:一个语言是正则的,当且仅当有一台 NFA 识别它。

正则表达式

引理2.29:正则表达式描述正则语言
证明:先验证小的正则表达式可以用 NFA 表示,再使用正则运算进行归纳。


引理2.32:正则语言可以用正则表达式描述
思路:

  • GNFA:箭头标号是正则表达式
  • 从 DFA 构造等价的 GNFA
  • 从 GNFA 构造等价的正则表达式

证明:

  • 设正则语言 A 被 DFA M 识别
  • 把 M 转换成等价的 GNFA G
  • 把 G 转换成等价的正则表达式

非正则语言

定理2.37(泵引理):设 A 是正则语言,则存在常数 p (泵长度),使得若 s∈As\in A,且 ∣s∣≥p|s|\geq p,则 s=xyzs=xyz,且满足下述条件:

  1. 任给的 i≥0,xyiz∈Ai\geq 0, xy^iz\in A
  2. ∣y∣>0|y|>0
  3. ∣xy∣≤p|xy|\leq p

证明:pp 为确定性有穷自动机的状态数,长度大于等于 pp 的串至少经过 p+1p+1 个状态。

使用方式:

  • 假设 BB 是正则的,设 pp 是泵长度
  • 取 s∈B,∣s∣≥ps\in B, |s|\geq p
  • 根据泵引理,s=xyzs=xyz
    1. 任给的 i≥0,xyiz∈Ai\geq 0, xy^iz\in A
    2. ∣y∣>0|y|>0
    3. ∣xy∣≤p|xy|\leq p
  • 证明存在 i≥0i\geq 0,使得xyiz∈Bxy^iz\in B,矛盾。