自动机理论的中心概念
有穷自动机 有穷自动机涉及一些状态和当响应输入时在状态之间的转移。用来构造许多不同种类的软件,例如包括编译器的词法分析部件以及电路与协议正确性的验证系统。
正则表达式 这是描述有穷自动机所表示的相同模式的结构记号。用在许多常见类型的软件中,例如包括查找文本模式或文件名模式的工具。
上下文无关文法 这是描述程序设计语言的结构以及相关的串集合的重要记号;用来构造编译器的语法分析部件。
图灵机 这是为真实计算机的能力建立模型的自动机。图灵机允许研究可判定性,即计算机能做什么或不能做什么的问题。也允许区分易解问题(即能在多项式时间内解决的问题)与难解问题(即不能在多项式时间内解决的问题)。
字母表 是符号的有穷非空集合,常用
Σ
\Sigma
Σ表示。
串 (单词) 是从某字母表中选择的有穷序列。出现0次符号的串称为空串,记作
ε
\varepsilon
ε。串的符号数称为长度,记作
∣
w
∣
|w|
∣w∣。
字母表的幂
Σ
k
\Sigma^k
Σk表示
Σ
\Sigma
Σ中长度为
k
k
k的串集合。
Σ
∗
\Sigma^*
Σ∗表示
Σ
\Sigma
Σ中所有串集合。
Σ
+
\Sigma^+
Σ+表示
Σ
\Sigma
Σ中非空串集合。
串的连接 例:
x
=
a
1
a
2
…
a
i
,
y
=
b
1
b
2
…
b
j
,
x
y
=
a
1
a
2
…
a
i
b
1
b
2
…
b
j
x=a_1a_2\dots a_i, y=b_1b_2\dots b_j, xy=a_1a_2\dots a_ib_1b_2\dots b_j
x=a1a2…ai,y=b1b2…bj,xy=a1a2…aib1b2…bj。
语言
L
⊆
Σ
∗
L\subseteq\Sigma^*
L⊆Σ∗,则
L
L
L是
Σ
\Sigma
Σ上的语言。
问题 给定
Σ
∗
\Sigma^*
Σ∗中的一个串
w
w
w,判定
w
w
w是否属于
L
L
L。
有穷自动机
本章核心思想总结:
DFA是描述有穷自动机的基本方式,引入非确定型和空串转移扩展功能可以简化设计,但功能等价,可以用固定算法把(
ε
\varepsilon
ε-)NFA编译成DFA再执行。
确定性有穷自动机
一个确定性有穷自动机DFA可表示成
A
=
(
Q
,
Σ
,
δ
,
q
0
,
F
)
A=(Q, \Sigma, \delta, q_0, F)
A=(Q,Σ,δ,q0,F)其中
- Q Q Q是一个有穷的状态集合。
- Σ \Sigma Σ是一个有穷的输入符号集合。
- δ \delta δ是一个转移函数,以一个状态和一个输入符号作为变量,返回一个状态。在非形式化表示自动机的图中,用状态之间的箭弧和箭弧上的标记来表示 δ \delta δ。如果 q q q是一个状态, a a a是一个输入符号,则 δ ( q , a ) \delta(q,a) δ(q,a)是这样的状态 p p p,使得从 p p p到 q q q有带标记 a a a的箭弧。
- 一个初始状态 q 0 q_0 q0,是 Q Q Q中状态之一。
- 一个终结状态或接收状态的集合 F F F。 F ⊆ Q F\subseteq Q F⊆Q
DFA如何处理串 DFA如何决定是否"接受"输入符号序列。DFA的"语言"是这个DFA接受的所有的串的集合。假设 a 1 a 2 … a n a_1a_2\dots a_n a1a2…an是输入符号序列。让这个DFA从初始状态 q 0 q_0 q0开始运行。查询转移函数 δ \delta δ,比如说 δ ( q 0 , a 1 ) = q 1 \delta(q_0, a_1)=q_1 δ(q0,a1)=q1,以找出DFA A A A在处理了第一个输入符号 a 1 a_1 a1之后进入的状态。处理下一个输入符号 a 2 a_2 a2,求 δ ( q 1 , a 2 ) \delta(q_1,a_2) δ(q1,a2)的值,假设这个状态是 q 2 q_2 q2。以这种方式继续下去,找出状态 q 3 , q 4 , … , q n q_3, q_4, \dots , q_n q3,q4,…,qn,使得对每个 i i i, δ ( q i − 1 , a 1 ) = q i \delta(q_{i-1},a_1)=q_i δ(qi−1,a1)=qi。如果 q n q_n qn属于 F F F,则接受输入 a 1 a 2 … a n a_1a_2\dots a_n a1a2…an, 否则就"拒绝"。
DFA表示方法
- 转移图
a) 对 Q Q Q中每个状态, 存在一个顶点.
b) 对 Q Q Q中每个状态 q q q和 Σ \Sigma Σ中每个输入符号 a a a, 设 δ ( q , a ) = p \delta(q, a)=p δ(q,a)=p. 于是转移图有从顶点 q q q到顶点 p p p的带 a a a标记的箭弧. 如果有几个输入符号都导致从 q q q到 p p p的转移, 则转移图有一个由这些符号列表标记的箭弧.
c) 有一个进入初始状态 q 0 q_0 q0的带Start标记的箭弧. 这个箭弧没有任何出发顶点.
d) 对应于接受状态(属于 F F F的那些状态)的顶点用双圆圈标记. 不属于 F F F的状态用单圆圈.
- 转移表
转移表是习惯上对像 δ \delta δ这样有两个变量和一个返回值的函数的表格表示。这个表的各行对应着状态,各列对应着输入。在状态 q q q对应的行和输入 a a a对应的列这个位置上的项是状态 δ ( q , a ) \delta(q, a) δ(q,a)。
把转移函数扩展到串
扩展转移函数描述从任何状态开始读任何序列时所发生的事情。由 δ \delta δ扩展出 δ ^ \hat{\delta} δ^:接收状态 q q q和串 w w w,返回状态 p p p, p p p是当自动机从 q q q开始处理输入序列 w w w时所到达的状态。通过对输入串的长度进行归纳来定义 δ ^ \hat{\delta} δ^如下:
基础: δ ^ ( q , ε ) = q \hat{\delta}(q, \varepsilon)=q δ^(q,ε)=q;
归纳:假设 w w w是形如 x a xa xa的串,也就是说, a a a是 w w w的结尾符号。于是 δ ^ ( q , w ) = δ ( δ ^ ( q , x ) , a ) \hat{\delta}(q, w)=\delta(\hat{\delta}(q, x), a) δ^(q,w)=δ(δ^(q,x),a)。
例子:设计一个DFA以接受语言 L = { w 丨 w 同 时 有 偶 数 个 0 和 偶 数 个 1 } L=\{w丨w同时有偶数个0和偶数个1\} L={w丨w同时有偶数个0和偶数个1}
这个DFA的状态的任务是同时数0和1的个数,但是需要模2来计数。因此有4个状态,这4个状态可以给出下列解释∶
q 0 q_0 q0∶ 迄今为止看到的0的个数和1的个数都是偶数。
q 1 q_1 q1∶ 迄今为止看到的0的个数是偶数而1的个数是奇数。
q 2 q_2 q2∶ 迄今为止看到的1的个数是偶数而0的个数是奇数。
q 3 q_3 q3∶ 迄今为止看到的0的个数和1的个数都是奇数。
状态 q 0 q_0 q0既是初始状态也是惟一的接受状态。
L的DFA是 A = ( { q 0 , q 1 , q 2 , q 3 } , { 0 , 1 } , δ , q 0 , { q 0 } ) A =(\{q_0,q_1,q_2,q_3\}, \{0,1\}, \delta, q_0, \{q_0\}) A=({q0,q1,q2,q3},{0,1},δ,q0,{q0})
DFA的语言 L ( A ) = { w ∣ δ ^ ( q 0 , w ) ∈ F } L(A)=\{w | \hat{\delta}(q_0, w)\in F\} L(A)={w∣δ^(q0,w)∈F},即语言 L ( A ) L(A) L(A)是让初始状态 q 0 q_0 q0通向接收状态之一的串 w w w的集合。如果对某个DFA A A A来说 L L L是 L ( A ) L(A) L(A),称 L L L为正则语言。
非确定型有穷自动机
一个非确定性有穷自动机NFA可表示成
A
=
(
Q
,
Σ
,
δ
,
q
0
,
F
)
A=(Q, \Sigma, \delta, q_0, F)
A=(Q,Σ,δ,q0,F)其中
- Q Q Q是一个有穷的状态集合。
- Σ \Sigma Σ是一个有穷的输入符号集合。
- δ \delta δ是一个转移函数,以一个状态和一个输入符号作为变量,返回一个 Q Q Q中状态的子集合。
- 一个初始状态 q 0 q_0 q0,是 Q Q Q中状态之一。
- 一个终结状态或接收状态的集合 F F F。 F ⊆ Q F\subseteq Q F⊆Q
扩展转移函数
基础:
δ
^
(
q
,
ε
)
=
q
\hat{\delta}(q, \varepsilon)=q
δ^(q,ε)=q;
归纳:假设
w
w
w是形如
x
a
xa
xa的串,
δ
^
(
q
,
x
)
=
{
p
1
,
p
2
,
…
,
p
k
}
\hat{\delta}(q, x)=\{p_1, p_2,\dots, p_k\}
δ^(q,x)={p1,p2,…,pk}。设
⋃
i
=
1
k
δ
(
p
i
,
a
)
=
{
r
1
,
r
2
,
…
,
r
m
}
\bigcup_{i=1}^k \delta(p_i, a)=\{r_1, r_2,\dots, r_m\}
i=1⋃kδ(pi,a)={r1,r2,…,rm}则
δ
^
(
q
,
w
)
=
{
r
1
,
r
2
,
…
,
r
m
}
\hat{\delta}(q, w)=\{r_1, r_2,\dots, r_m\}
δ^(q,w)={r1,r2,…,rm}。
NFA的语言 L ( A ) = { w ∣ δ ^ ( q 0 , w ) ∩ F ≠ ∅ } L(A)=\{w | \hat{\delta}(q_0, w)\cap F\neq \varnothing \} L(A)={w∣δ^(q0,w)∩F=∅},即 L ( A ) L(A) L(A)是 Σ ∗ \Sigma^* Σ∗中使得 δ ^ ( q 0 , w ) \hat{\delta}(q_0, w) δ^(q0,w)至少包含一个接收状态的串 w w w的集合。
DFA和NFA的等价性 子集构造:用一个自动机的状态和转移来描述另一个自动机,却不知道前者的具体情况。
D
D
D的部件构造:
从一个NFA
N
=
(
Q
N
,
Σ
,
δ
N
,
q
0
,
F
N
)
N=(Q_N, \Sigma, \delta_N, q_0, F_N)
N=(QN,Σ,δN,q0,FN)开始,目标是描述一个DFA
D
=
(
Q
D
,
Σ
,
δ
D
,
{
q
0
}
,
F
D
)
D=(Q_D, \Sigma, \delta_D, \{q_0\}, F_D)
D=(QD,Σ,δD,{q0},FD),使得
L
(
D
)
=
L
(
N
)
L(D)=L(N)
L(D)=L(N)。
- Q D Q_D QD是 Q N Q_N QN的子集的集合(幂集),可以丢弃不可达状态,因此 D D D的状态数远小于 2 n 2^n 2n。
- F D F_D FD是使得 S ∪ F N ≠ ∅ S\cup F_N\neq\varnothing S∪FN=∅的 Q N Q_N QN的子集合 S S S的集合。即 F D F_D FD是所有至少含有一个 N N N的接收状态集合的集合。
- 对于每个集合 S ⊆ Q N S\subseteq Q_N S⊆QN以及 a ∈ Σ a\in\Sigma a∈Σ, δ D ( S , a ) = ⋃ p ∈ S δ N ( p , a ) \delta_D(S, a)=\bigcup_{p\in S}\delta_N(p, a) δD(S,a)=p∈S⋃δN(p,a)即为了计算 δ D ( S , a ) \delta_D(S, a) δD(S,a),检查 S S S中所有的状态 p p p,看看 N N N在输入 a a a上从 p p p进入哪些状态,取所有这些状态的并集。
构造的合理性的证明:对 w w w进行归纳。 δ ^ D ( { q 0 } , w ) = δ ^ N ( q 0 , w ) \hat\delta_D(\{q_0\}, w)=\hat\delta_N(q_0, w) δ^D({q0},w)=δ^N(q0,w) 基础∶设 l w l = 0 lwl=0 lwl=0,即 w = ε w=\varepsilon w=ε。由定义, δ ^ D ( { q 0 } , ε ) \hat\delta_D(\{q_0\}, \varepsilon) δ^D({q0},ε)和 δ ^ N ( q 0 , ε ) \hat\delta_N(q_0, \varepsilon) δ^N(q0,ε)都是 { q 0 } \{q_0\} {q0}。
归纳:设 w w w长度为 n + 1 n +1 n+1,假设命题对长度 n n n成立。把 w w w分解成 w = x a w= xa w=xa,根据归纳假设, δ ^ D ( { q 0 } , x ) = δ ^ N ( q 0 , x ) \hat\delta_D(\{q_0\}, x)=\hat\delta_N(q_0, x) δ^D({q0},x)=δ^N(q0,x)。设这两个 N N N的状态集合都是 { p 1 , p 2 , … , p k } \{p_1, p_2,\dots, p_k\} {p1,p2,…,pk}。
NFA的 δ ^ \hat\delta δ^的定义的归纳部分说明: δ ^ N ( q 0 , w ) = ⋃ i = 1 k δ N ( p i , a ) \hat\delta_N(q_0, w)=\bigcup_{i=1}^k\delta_N(p_i, a) δ^N(q0,w)=i=1⋃kδN(pi,a)另一方面,子集构造说明:
δ D ( { p 1 , p 2 , … , p k } , a ) = ⋃ i = 1 k δ N ( p i , a ) \delta_D(\{p_1, p_2,\dots, p_k\}, a)=\bigcup_{i=1}^k\delta_N(p_i, a) δD({p1,p2,…,pk},a)=i=1⋃kδN(pi,a)并由事实 δ ^ D ( { q 0 } , x ) = { p 1 , p 2 , … , p k } \hat{\delta}_D(\{q_0\}, x)=\{p_1, p_2,\dots, p_k\} δ^D({q0},x)={p1,p2,…,pk}得
δ ^ D ( { q 0 } , w ) = δ D ( δ ^ D ( { q 0 } , x ) , a ) = δ D ( { p 1 , p 2 , … , p k } , a ) = ⋃ i = 1 k δ N ( p i , a ) \hat{\delta}_D(\{q_0\}, w)=\delta_D(\hat{\delta}_D(\{q_0\}, x), a)=\delta_D(\{p_1, p_2,\dots, p_k\}, a)=\bigcup_{i=1}^k\delta_N(p_i, a) δ^D({q0},w)=δD(δ^D({q0},x),a)=δD({p1,p2,…,pk},a)=i=1⋃kδN(pi,a)由此原式得证。当注意到 D D D和 N N N都接受 w w w当且仅当 δ ^ D ( { q 0 } , w ) \hat\delta_D(\{q_0\}, w) δ^D({q0},w)或 δ ^ N ( q 0 , w ) \hat\delta_N(q_0, w) δ^N(q0,w)分别包含一个 F N F_N FN中的状态时,就得到了 L ( D ) = L ( N ) L(D)=L(N) L(D)=L(N)的完整证明。
一个语言 L L L被某个DFA接受,当且仅当 L L L被某个NFA接受。
例子:文本搜索的NFA
设计一个识别单词web和ebay的出现的NFA。
状态1是初始状态,符号
Σ
\Sigma
Σ表示所有可打印ASCII的字符,状态2-4识别web,5-8识别ebay。
NFA的实现有两种主要选择∶
1.写一个程序来模拟这个NFA,计算出读每个输入符号后所处的状态的集合。
2. 用子集构造把NFA转化成等价的DFA。然后直接模拟这个DFA。
带 ε \varepsilon ε转移的有穷自动机
扩展功能:描述“可有可无”的输入。
一个扩展的非确定性有穷自动机
ε
\varepsilon
ε-NFA可表示成
A
=
(
Q
,
Σ
,
δ
,
q
0
,
F
)
A=(Q, \Sigma, \delta, q_0, F)
A=(Q,Σ,δ,q0,F)其中
δ
\delta
δ现在是有下列变量的函数∶
1.Q中一个状态。
2.、
Σ
∪
{
ε
}
\Sigma\cup\{\varepsilon\}
Σ∪{ε}中一个元素,也就是说,要么是输入符号,要么是
ε
\varepsilon
ε符号。要求空串符号
ε
\varepsilon
ε不是字
母表
Σ
\Sigma
Σ中的元素,所以不会导致混乱。
ε
\varepsilon
ε闭包 顺着所有从状态
q
q
q出发带
ε
\varepsilon
ε标记的转移来求状态
q
q
q的
ε
\varepsilon
ε闭包。
递归地定义闭包
ECLOSE
(
q
)
\text{ECLOSE}(q)
ECLOSE(q):
基础:状态q属于
ECLOSE
(
q
)
\text{ECLOSE}(q)
ECLOSE(q)。
归纳:如果p属于
ECLOSE
(
q
)
\text{ECLOSE}(q)
ECLOSE(q),并且有从状态
p
p
p到状态
r
r
r带
ε
\varepsilon
ε标记的转移,则
r
r
r属于
ECLOSE
(
q
)
\text{ECLOSE}(q)
ECLOSE(q)。
更谁确地说,如果
δ
\delta
δ是所讨论的
ε
\varepsilon
ε-NFA的转移函数,且
p
p
p属于
ECLOSE
(
q
)
\text{ECLOSE}(q)
ECLOSE(q),则
ECLOSE
(
q
)
\text{ECLOSE}(q)
ECLOSE(q)也包含所有属于
δ
(
p
,
ε
)
\delta(p, \varepsilon)
δ(p,ε)的状态。
状态集合
S
S
S的
ε
\varepsilon
ε闭包:
ECLOSE
(
S
)
=
⋃
q
∈
S
ECLOSE
(
q
)
\text{ECLOSE}(S)=\bigcup_{q\in S}\text{ECLOSE}(q)
ECLOSE(S)=⋃q∈SECLOSE(q)
扩展转移函数
基础:
δ
^
(
q
,
ε
)
=
ECLOSE
(
q
)
\hat{\delta}(q, \varepsilon)=\text{ECLOSE}(q)
δ^(q,ε)=ECLOSE(q);
归纳∶设
w
w
w形如
x
a
xa
xa。注意,
a
a
a属于
Σ
\Sigma
Σ;
a
a
a不能是
ε
\varepsilon
ε,
ε
\varepsilon
ε不属于
Σ
\Sigma
Σ。计算
δ
^
(
q
,
w
)
\hat\delta(q, w)
δ^(q,w)如下∶
- 设 δ ^ ( q , x ) \hat\delta(q, x) δ^(q,x)为 { p 1 , p 2 , … , p k } \{p_1, p_2,\dots, p_k\} {p1,p2,…,pk}。也就是说,这些 p i p_i pi是从 q q q顺着标记为 x x x的路径可达的所有状态。 这条路径可能以一个或多个带 ε \varepsilon ε标记的转移来结尾,也可能有其他的 ε \varepsilon ε转移。
- 设 ⋃ i = 1 k δ ( p i , a ) \bigcup_{i=1}^k \delta(p_i, a) ⋃i=1kδ(pi,a)为 { r 1 , r 2 , … , r m } \{r_1, r_2,\dots,r_m\} {r1,r2,…,rm}。也就是说,顺着带 x x x标记的路径从 q q q到达一些状态,遵循 所有带 a a a标记的从这些状态发出的转移。这些 r j r_j rj是顺着带 w w w标记的路径从 q q q可达的一些状态。顺着下面步骤(3)中的标记 ε \varepsilon ε的箭弧,从这些 r j r_j rj求出其他的可达的状态。
- δ ^ ( q , w ) = ⋃ j = 1 m ECLOSE ( r j ) \hat\delta(q, w)=\bigcup_{j=1}^m \text{ECLOSE}(r_j) δ^(q,w)=⋃j=1mECLOSE(rj)。这个附加的闭包步骤包含了所有从 q q q出发带 w w w标记的路径,考虑到了在最后的"实"符号 a a a上转移后,存在其他带 ε \varepsilon ε标记的箭弧可以遵循的可能性。
消除
ε
\varepsilon
ε转移 (转化成DFA)
给定
ε
\varepsilon
ε-NFA
E
=
(
Q
E
,
Σ
,
δ
E
,
q
0
,
F
E
)
E=(Q_E, \Sigma, \delta_E, q_0, F_E)
E=(QE,Σ,δE,q0,FE)开始,等价DFA
D
=
(
Q
D
,
Σ
,
δ
D
,
{
q
0
}
,
F
D
)
D=(Q_D, \Sigma, \delta_D, \{q_0\}, F_D)
D=(QD,Σ,δD,{q0},FD),使得
L
(
D
)
=
L
(
E
)
L(D)=L(E)
L(D)=L(E)。
- Q D Q_D QD是 Q E Q_E QE的幂集。D的所有可达状态都是 Q E Q_E QE的 ε \varepsilon ε闭子 集,也就是说,这些集合 S ⊆ Q E S\subseteq Q_E S⊆QE使得 S = ECLOSE ( S ) S= \text{ECLOSE}(S) S=ECLOSE(S)。换句话说,状态 S S S的 ε \varepsilon ε闭集就是使得从 S S S中状态之一出发的任意 ε \varepsilon ε转移都导向还是属于 S S S的状态的集合。注意, ∅ \varnothing ∅是 ε \varepsilon ε闭集。
- δ D = ECLOSE ( q 0 ) \delta_D= \text{ECLOSE}(q_0) δD=ECLOSE(q0),即 D D D的初始状态是对仅由 E E E的初始状态构成的集合求闭包得到的。
- F D F_D FD是使得 S ∪ F E ≠ ∅ S\cup F_E\neq\varnothing S∪FE=∅的 Q N Q_N QN的子集合 S S S的集合。即 F D F_D FD是所有至少含有一个 E E E的接收状态集合的集合。
- 对于每个集合
S
⊆
Q
N
S\subseteq Q_N
S⊆QN以及
a
∈
Σ
a\in\Sigma
a∈Σ,计算
δ
D
(
S
,
a
)
\delta_D(S, a)
δD(S,a)的方法如下:
- 设 S = { p 1 , p 2 , … , p k } S=\{p_1, p_2,\dots, p_k\} S={p1,p2,…,pk}。
- 计算 ⋃ i = 1 k δ E ( p i , a ) \bigcup_{i=1}^k \delta_E(p_i, a) ⋃i=1kδE(pi,a),设为 { r 1 , r 2 , … , r m } \{r_1, r_2,\dots,r_m\} {r1,r2,…,rm}。
- δ D ( S , a ) = ⋃ j = 1 m ECLOSE ( r j ) \delta_D(S, a)=\bigcup_{j=1}^m \text{ECLOSE}(r_j) δD(S,a)=⋃j=1mECLOSE(rj)
一个语言 L L L被某个 ε \varepsilon ε-NFA接受,当且仅当 L L L被某个DFA接受。
证明类似NFA,略