有穷自动机
有穷自动机为一种识别装置,能准确地识别正规集。它为词法分析程序的自动构造提供了有效的方法和工具。
有穷自动机分为两类:
- 确定的有穷自动机 (Deterministic Finite Automata: DFA)
- 不确定的有穷自动机 (Nondeterministic Finite Automata: NFA)
确定的有穷自动机DFA :
DFA定义:
一个确定的有穷自动机(DFA)M是一个五元组:
M= (K,Σ, f, S, Z), 其中
- K是一个有穷集,它的每个元素称为一个状态;
- Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以Σ也称为输入符号表;
- f是转换函数,是在K×Σ→K上的单值映射,即如存在f(ki, a)=kj, (ki∈K,kj∈K) ,则当前状态为ki且输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;
- S∈K是唯一的一个初态;
- Z⊂K是一个终态集,终态也称可接受状态或结束状态。
例 : DFA M=({S,U,V,Q},{a,b},f,S,{Q}) 其中f定义为:
f(S,a)=U f(V,a)=U
f(S,b)=V f(V,b)=Q
f(U,a)=Q f(Q,a)=Q
f(U,b)=V f(Q,b)=Q
DFA 的状态图表示:
DFA 的矩阵表示:
-
∑
*上的符号串t被DFA M接受 :
- 定义1: 对∑ *中的任何符号串t, 若存在一条从初态结点到某一终态结点的道路,且这条道路上所有弧连接成的符号串等于t,则称t可为DFA M所接受,若M的初态同时又是终态结点,则空字可为M所接受。
- 定义2: 若t∈∑ *, f(S,t)=P,其中S为DFA M的开始状态, P∈Z, Z为终态集,则称t 可为M所接受(识别)。
DFA M所能接受的符号串的全体记为L(M)。
DFA的确定性表现在 f: K×∑→K是一个单值函数。
-
∑*上的符号串 t 在DFA M上运行:
- 一个输入符号串t (表示为t1 tx), 其中t1∈∑, tx∈ ∑ *, 则t在DFA M上运行的定义为: f(Q, t1 tx)=f(f(Q, t1), tx) ,其中 Q∈K, f(Q, ε)=Q。
∑上一个符号串集V⊂∑*是正规的,当且仅当存在一个∑上的DFA M ,使得V=L(M)。
例 : 证明t=baab被下图的DFA所接受
f(S,baab)=f(f(S,b),aab)
=f(V,aab) = f(f(V,a),ab)
=f(U,ab) =f(f(U,a),b)
=f(Q,b) =Q
Q属于终态。得证。
DFA行为的程序模拟. DFA M=(K,Σ,f,S,Z)的行为的模拟程序
K:=S;
c:=getchar;
while c<>eof do
{ K:=f(K,c);
c:=getchar;
};
if K is in Z then return (‘yes’)
else return (‘no’)
不确定的有穷自动机NFA :
NFA定义:
NFA N=(K, Σ, f, S, Z),其中K为有穷状态集,Σ为有穷输入字母表,f为K×∑ 到K的子集的映射, S⊆K是一个非空初态集,Z⊆K为终态集。
NFA与DFA的区别主要有:
- NFA中状态转换函数为多值函数。
- NFA中起始状态可以有多个,但从正规文法出发构造的NFA起始状态是唯一的。
例 : NFA N=({S,P,Z},{0,1},f,{S,P},{Z})
其中
f(S,0)={P}
f(S,1)={S,Z}
f(P,1)={Z}
f(Z,0)={P}
f(Z,1)={P}
矩阵表示
-
类似DFA, NFA N=(K,Σ,f,S,Z)也有如下定义:
符号串 t 在NFA N上运行
- 一个输入符号串t (将它表示成Tt 1的形式, 其中T∈∑, t 1∈∑ *) 在NFA N上运行的定义为: f(Q, Tt1)=f ( f(Q, T), t1) 其中Q∈K. 符号串 t 被NFA N接受
- 若f(S 0, t)=P, 其中t∈∑ * , S 0 ∈S, P∈Z, 则称t为NFA N所接受 (识别)
符号串 t 被NFA N接受也可以这样理解:
对于任何一个符号串t (t∈∑*) ,若存在一条从某一初态到某一终态的道路,且这条道路上所有弧的标记字依序连接成的串(不计ε弧)等于t,则称t为NFA N所接受。
有了上述定义后,实际上也就是对NFA的转换函数f进行了如下扩充:
f: K×∑ → K的子集 → f: K×∑* → K的子集
例 :下列符号串哪些可以被图中NFA所接受?
111
1010001
00
01100
111
1010001
若将NFA N所能接受的符号串的全体记为L(N),则有如下结论:
对每个NFA N存在着与之等价的DFA M,使得L(M)=L(N)。并且最小的DFA M是唯一的。
将NFA转换成等价的DFA的算法—子集法。
NFA的确定化 :
有关状态集合I的两个运算:
- 状态集合I的ε-闭包,记为ε-closure(I),定义为一状态集,是由状态集I中的任何状态S经任意条ε弧而能到达的状态所构成的集合。
状态集合I的任何状态都属于ε-closure(I)。 - 状态集合I的a弧转换,记为move(I,a),是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。
例 : 若 I1= {1},则
ε-closure(I1)={1,2};
move(I1,a)={4,5};
计算下列各式的值
1) move({1,2},a)
2) ε-closure({5,3,4})
运算结果:
1) ={5,3,4};
2) ={2,3,4,5,6,7,8};
子集法: 假设NFA N=(K,∑,f,K0,Kt),按如下方法可构造一个DFA M=(S,∑,d,S0,St),使得L(M)=L(N):
- M的状态集S由K的一些子集组成。用[S1,S2 ,…, Sj]表示S的元素,其中 S1,…,Sj是K的状态。且约定状态S1,…,Sj 是按某种规则排列的,即对于子集{S1,S2}={S2,S1} 来说,S的状态就是[S1,S2];
- M和N的输入字母表是相同的,即是∑;
- 转换函数是这样定义的:d([S1,S2 ,…, Sj], a)= [R1,R2 , … , Rt]
其中 [R1,R2 , … , Rt]= ε-closure( move([S1,S2 ,…, Sj], a) ) - S0=ε-closure(K0)为M的开始状态;
- St={[Si,Sk ,…, Se], 其中[Si,Sk ,…, Se]∈S
且 {Si,Sk ,…, Se}∩Kt ≠ ∅}
例 : 将下图NFA N=(K,∑,f,K0,Kt)转换为等价的DFA M其中M=(S,∑,d,S0,St)。
转换为DFA后的状态图
DFA的化简(最小化):
对于任何给定的DFA,都存在一个与之等价的最少状态DFA,并且该最少状态DFA是唯一的。
最少状态DFA应满足没有多余状态和没有等价状态
多余状态:从自动机的开始状态出发,任何输入串也不能到达的状态;或者是没有通路到达终态的状态。
两个状态s和t等价是指它们具备以下特性:
- 一致性(兼容性): 即两状态同是终态或同是非终态
- 蔓延性: 对所有输入符号,状态s和t必须转换到等价的状态里。或者说从两状态出发所接受的符号串集合相同
上面的例题图中D、E、F、G为等价状态。
一个DFA可以通过消除多余状态和合并等价状态而转换成一个与之等价的最小DFA。
DFA的最小化算法(分割法)
算法的核心思想:把一个DFA的状态分成一些不相交的子集,使得任何不同的两子集的状态都是可区别的,而同一子集中的任何两个状态都是等价的。
算法具体步骤:以DFA M=(K,∑,f,K0,Kt)的最小化为例
- 构造自动机的初始划分:终态集Kt和非终态集K-Kt两组
- 对各状态集按下面方法进行划分,直到所有状态集合不再产生新的划分为止。设第m次划分将K分成n个状态集合(K=S1∪S2…∪Sn)。对状态集合Si 中的各状态逐一检查,设q1,q2是状态集合Si中的两个状态,对任意输入符号a ,有f(q1,a)= S’, f(q2,a)=S”,若状态S’和S”不属于同一状态集,则将q1和q2分为两个集合。
- 重复第2步,直到所有状态集合都不能划分。
- 将每个状态集中的等价状态合并成一个状态。
- 删除多余状态。

浙公网安备 33010602011771号