第三章 有穷自动机Word文档下载推荐.docx
《第三章 有穷自动机Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第三章 有穷自动机Word文档下载推荐.docx(24页珍藏版)》请在冰豆网上搜索。
一个确定的有穷自动机M(记作DFAM)是一个五元组M=(K,Σ,f,S,Z),其中
(a)K是一个有限状态集合。
(b)Σ是一个字母表,它的每个元素称为一个输入字符。
(c)SK,S称为初始状态,唯一。
(d)ZK,Z称为终态集合,终态也称可接受状态或结束状态。
(e)f是转换函数,是一个从K×
Σ到K的单值映射。
f(ki,a)=kj(ki,kjQ,aΣ)kj称为ki的一个后继状态。
确定性的体现:
初始状态唯一;
转换函数为单值映射。
例:
设DFAM=({S,U,V,Q},{a,b},f,S,{Q})其中
f(S,a)=U,f(S,b)=V
f(U,a)=Q,f(U,b)=V
f(V,a)=U,f(V,b)=Q
f(Q,a)=Q,f(Q,b)=Q
因为
(1)初始状态唯一是S,
(2)每个转换函数均为单值映射。
所以该FA为确定有穷自动机。
二、状态转换表
DFA的映射关系可以由一个矩阵表示,矩阵的行标表示状态,列标表示输入字符,矩阵元素表示f(s,a)的值,这个矩阵称为状态转换表。
a
b
S
U
V
Q
f(S,a)=U
f(S,b)=V
f(U,a)=Q
f(U,b)=V
f(V,a)=U
f(V,b)=Q
f(Q,a)=Q
f(Q,b)=Q
q1
q2
q3
q0
三、状态转换图
图中标有的为开始状态,标有双圈的状态为终止状态。
若f(Ki,a)=Kj,则从状态结点Ki到状态Kj画标记为a的弧。
四、自动机的等价性
为了讨论自动机的等价性,先对DFA中的映射进行扩充。
1、扩充的转换函数f
(1)设QK,函数f(Q,ε)=Q,即如果输入字符是空串,则仍停留在原来的状态上。
(2)对QK,TΣ,t1Σ*,f(Q,Tt1)=f(f(Q,T),t1)该定义是一个递归定义,说明当自动机处在状态Q且面临某个输入串Tt1时,则首先应用函数f(Q,T)=P,然后应用函数f(P,t1)。
DFA的确定性表现在转换函数f:
K×
Σ→K是一个单值函数,即对任何状态kK和输入符号aΣ,f(k,a)唯一地确定了下一个状态,从状态转换图来看,若字母表Σ含有n个输入字符,那么任何一个状态结点最多有n条弧射出,且每条弧以一个不同的输入字符标记。
2、自动机接受字符串x:
如果对于某一自动机M=(K,Σ,f,S,Z),xΣ*,有f(S,x)=P,且PZ,则x为该自动机M所接受(识别),即自动机从开始状态开始,在读完全部输入串以后,自动机恰恰到达终止状态,则该输入串能被该自动机所接受。
DFAM=({S,A,B,C},{0,1},,S,{S}),且定义为(S,0)=B,(S,1)=A,(A,0)=C,
(A,1)=S,(B,0)=S,(B,1)=C,(C,0)=A,(C,1)=B
状态图表示,矩阵表示:
自动机处理字符串110101和11101的轨迹
(S,110101)=((S,1),10101)=(A,10101)=((A,1),0101)=(S,0101)=
((S,0),101)=(B,101)=((B,1),01)=(C,01)=((C,0),1)=(A,1)=S(接受)
(S,11101)=((S,1),1101)=(A,1101)=((A,1),101)=(S,101)=((S,1),01)=
(A,01)=((A,0),1)=(C,1)=B(拒绝)
3、所有为自动机M所能接受的串组成一个集合,称这个集合为自动机M所能接受的语言,用L(M)表示:
L(M)={t|f(S,t)Z,tΣ*}
4、对于任何两个有穷自动机M和M’,如果L(M)=L(M’),则称M与M’是等价的。
五、非确定有穷自动机
1、NFA定义
一个不确定的有穷自动机NFAM’是一个五元组:
M’=(K,Σ,f,S,Z)
一个含有m个状态和n个输入字符的NFA可表示为一张状态转换图,该图含有m个状态结,每个结可射出若干条箭弧与别的结点相连接,每条弧用Σ*中的一个字(不一定要不同的字,且可以为空字)作标记(称输入字),整个图至少含有一个初态结以及若干个终态结。
2、NFA与DFA的区别
(1)NFA有一个开始状态集,而DFA只有一个开始状态。
(2)NFA的映射是Q×
Σ→Q的子集,是一个多值映射,而DFA的映射是Q×
Σ→Q,是一个单值映射。
(3)DFA是NFA的特例,对于每个NFAM,存在一个DFAM’,使得L(M)=L(M’)。
3、对于Σ*中的任何一个串t,若存在一条从某一初态结到某一终态结的道路,且这条道路上的所有弧的标记依序连接成的串等于t,则称t可为NFAM所识别(读出或接受)。
若M的某些结既是初态结,又是终态结,或者存在一条从某个初态结到某个终态结的ε道路,则空字可为M所接受。
NFAM=({0,1,2,3,4},{a,b},f,{0},{2,4})
f(0,a)={0,3}f(2,b)={2}f(0,b)={0,1}f(3,a)={4}f(1,b)={2}
f(4,a)={4}f(2,a)={2}f(4,b)={4}
3
4
1
2
a,b
可用状态图或矩阵表示:
3.2NFA到DFA的转换
一、确定化——造表法
造表法是一种简单而有效的确定化方法。
定义:
设NFAM=(Q,Σ∪{ε},t,Q0,F),假定I是M中状态集的一个子集,定义
ε_closure(I)如下:
①若qI,则qε_closure(I);
②若qε_closure(I),q’是由q出发经多条ε弧到达的状态,则q’ε_closure(I)。
假定I是NFAM中状态集的一个子集,aΣ,定义
Ia=ε_closure(J)
其中J是所有那些可从子集I中的任一状态出发,经过一条a连线(跳过a连线前的ε连线)而到达的状态(结)的全体。
造表法的具体步骤:
假定给定的NFAM中(仅含两个符号a,b。
可用如下方法将M确定化:
采用造表的方式,该表的每一行有三列(若(中含有n个符号,则该表有n+1列),第一列记为I,第二、三列分别记为Ia,Ib。
①置该表的第一行第一列为(_closure(Q0),即一列包含M初态集Q0的ε_闭包。
然后计算它的Ia和Ib,分别填入第二、三列上,一般,若某一行的第一列上的I已确定,便可根据前述定义求出这一行的第二、第三列上的Ia和Ib。
②检查Ia和Ib,看它们是否已在表的第一列中出现,把未曾出现者之一填入下一空行的第一列上,再计算该行的第二、第三列上的Ia和Ib。
③重复第二步,直至表中所有第二、第三列上的元素全部再第一列出现为止。
因为M中的状态(子集)的个数是有限的,所以上述三步必定在有限步骤内终止。
④将由上述过程得到的最终形式的表看作一个状态转换表,即把其中第一列中的元素作为状态,把Ia,Ib分别看作是输入符号a,b,把其余信息看作是状态转换函数之值。
这个表唯一地刻画了一个确定的有穷状态自动机M’,其初态是该表第一行第一列的元素,其终态是该表中所有那些含有原终态的元素。
可以证明,这个DFAM’和NFAM是等价的。
5
6
7
8
9
10
有一NFAM如下,用造表法使其确定化。
解:
构造M’状态转换表
[0,1,2,4,7]
[1,2,3,4,6,7,8]
[1,2,4,5,6,7]
[1,2,4,5,6,7,9]
[1,2,4,5,6,7,10]
M’最终状态转换表
Q0
Q1
Q2
Q3
Q4
二、确定的有穷自动机的化简
1、所谓一个确定的有穷自动机M的化简是指:
寻找一个状态数比M少的DFAM’,使得L(M)=L(M’),可通过消除多余状态和合并等价状态而转换成一个最小的与之等价的有穷自动机。
2、消除多余状态
多余状态是指从该自动机的开始状态出发,任何输入串也不能到达的状态。
3、合并等价状态
等价状态:
若s和t是M的两个不同状态,称s和t等价:
如果从状态s出发能读出某个字α而停于终态,同样从t出发也能读出同一个字α而停于终态;
反之若从t出发能读出某个字α而停于终态,则从s出发也能读出同一个字α而停于终态。
如果DFAM的两个状态s和t不等价,则称这两个状态是可区别的。
DFA中,状态s和t等价的条件是:
一致性条件:
状态s和t必须同时为可接受状态(终态)或不可接受状态(非终态)。
蔓延性条件:
对于所有输入符号,状态s和t必须转换到等价的状态里。
4、分割法合并等价状态
一个DFAM的状态化简过程就是把M的状态集划分成一些不相交的子集,使得任何不同的两子集的状态都是可区分的,而同一子集的任何两个状态都是等价的。
最后,从每个子集选出一个代表(代表该子集),同时消去其它等价状态。
对M的状态集S进行划分的步骤:
①把S的终态与非终态分开,分成两个子集,形成基本划分Π,属于这两个不同子集的状态是可区别的。
②假定某个时候Π已含m个子集,记Π={I
(1),I
(2),…,I(m)}且属于不同子集的状态是可区别的,再检查Π中的每个I能否进一步划分,对于某个I(i),令I(i)={S1,S2,…,Sk},若存在一个输入字符使得move(I(i),a)不包含在现行Π的某一子集I(i)中,则将I(i)一分为二。
将图示的DFAM最小化。
1、将M状态分为两个子集:
P0=({1,2,3,4},{5,6,7})
2、{1,2,3,4}读入a后划为:
P1=({1,2},{3,4},{5,6,7})
3、进一步划分:
P2=({1,2},{3},{4},{5,6,7})
4、考察{5,6,7},将P2划分为:
P3=({1,2},{3},{4},{5},{6,7})
P3不可再划分,从而1与2,6与7等价。
三、从化简后的DFA到程序表示
识别标识符的DFA(图(a))需改为图(b)所示状态,其中,l代表字母,d代表数字。
图(a)图(b)
若赋予状态q0、q1与q2一定的操作,则可得识别单词标识符的程序流程图(见下图)。
3.3正规文法与有穷自动机
正规文法与有穷自动机FA有着特殊的关系。
可以证明:
对任何正规文法G,可以构造一个FA,它能而且只能识别语言L(G);
反过来,对任何FA,可以构造一个相应的正规文法G,它能生成由该FA所识别的语言。
一、从正规文法到FA
设正规文法G有形如U→aV(aVT,VVN或V=ε)的产生式。
由正规文法G可以直接构造一个有穷自动机A(简称自动机A),使L(A)=L(G)。
构造步骤如下:
①令正规文法G的终结符号集作为有穷自动机A的字母表;
②文法G的每一个非终结符都作为自动机A的一个状态,特别是文法G的开始符作为自动机A的开始状态;
③在自动机A中增加一个新状态z作为自动机的终止状态;
④对于文法G的形如U→aV(aVT,或a=ε,VVN)的产生式,在自动机A中构造形如t(U,a)=V的映射;
⑤对文法G的形如U→a(aVT)的产生式,在自动机A中构造形如t(U,a)=z的映射。
二、从FA到正规文法
从正规文法可直接构造其自动机,反之,由自动机也可直接构造其正规文法。
①自动机每一个状态的标记,均作为正规文法的非终结符,其中,自动机开始状态的标记将作为正规文法的开始符号。
自动机的输入字母表中的所有符号,作为正规文法的终结符。
②对于自动机的映射t(U,a)=V(其中,U、V为自动机的状态标记;
a为输入符号),构造文法的一条产生式
U→aV
U、V为文法的非终结符,a为终结符。
③对于自动机的终止状态Z,在正规文法中增加一条产生式
Z→ε
3.4正规表达式与FA
正规式也称正规则式、正规表达式,与正规文法的功能一样,正规式也可用以描述程序设计语言的单词符号。
一、正规表达式的操作符
1、连接
假定有两个正规表达式e1和e2,它们分别产生语言L1和L2,于是定义正规表达式的连接操作为
e1e2={xy|xL1,yL2}其中可省略
2、选择
可用|或+表示,定义为e1|e2={x|xL1或xL2}
3、重复
用*表示,表示*中的表达式的0次到若干次的自重复连接,即e*={x|xL1*}
正规表达式110由数字1,1,0连接在一起组成,且表示的语言为L={110}
表达式0|1所表示的语言为L={0,1}
表达式1*所表示的语言为L={1i|i=0,1,2...}
用正则表达式表示
{标识符}=字母(字母|数字)*
{实数}=((|+|-)(数字*.数字数字*)
二、正规表达式的定义
所有正规表达式都可由下列规则构造出来:
①是一个表示空集的正规表达式
②ε是一个正规表达式,它所表示的语言仅包含一个空符号串,即{ε}
③a是一个正规表达式,aVT它所表示的语言(它所表示的正规集)是单个符号a所组成,即{a}
④如果e1和e2是正规表达式,其表示的语言分别为L1和L2,
(e1)|(e2)是一个表示语言L1∪L2的正规表达式
(e1)((e2)是一个表示语言L1L2的正规表达式
(e1)*是一个表示语言L1*的正规表达式
⑤正规表达式中操作符的优先级顺序为*,连接,|
正规表达式a*b*表示的正规集是{ambn|m≥0,n≥0}
正规表达式(ab)*表示的正规集是{(ab)m|m≥0}
正规表达式(a|b)*表示的正规集是{x|x{a,b}*}
表达式(aa|ab|ba|bb)*表示在VT={a,b}上的所有偶长度的串
三、正规表达式的等价性
如果两个正规表达式表示相同的语言,则这两个正规表达式相等或等价,故有00*=000*|0
四、正规表达式的性质
r|s=s|r或满足交换律
r|(s|t)=(r|s)|t或满足结合律
(rs)t=r(st)连接满足结合律
r(s|t)=rs|rt(s|t)r=sr|tr分配律
εr=r,rε=rε是连接的恒等元素
程序设计语言中的单词都能用正规式来定义,如:
∑={字母,数字}上的正规式e1=字母(字母|数字)*表示的是所有标识符的集合
正规式e=dd*定义了无符号整数
令∑={d,.,e,+,-},则∑上的正规式(d*.dd*|dd*)(e(+|-|ε)dd*|ε)表示的是无符号数。
五、正规文法与正规式
一个正规语言可以由正规文法定义,也可以由正规式定义,对任意一个正规文法,存在一个定义同一个语言的正规式;
反之,对每个正规式,存在一个生成同一语言的正规文法。
1、正规式转换成正规文法
将∑上的一个正规式转换成文法G=(VN,VT,P,S),令其中的VT=∑,确定产生式和VN的元素用如下方法:
①对任何正规式r,选择一个非终结符S,生成产生式S→r,并将S定为G的识别符号。
②若x和y都是正规式,对形如A→xy的产生式,重写为A→xB,B→y两产生式,其中B是新选择的非终结符,即BVN。
③对已转换的文法中的形如A→x*y的产生式,重写为A→xA,A→y
④对形如A→x|y的产生式重写为A→x,A→y
不断利用上述规则作变换,直到每个产生式最多含有一个VN为止。
将R=a(a|d)*转换成相应的正规文法。
令S是识别符号,首先形成S→a(a|d)*,下一步,
S→aA,A→(a|d)*,重写为:
A→(a|d)A,A→ε
进而转变为:
S→aA,A→aA,A→dA,A→ε
2、正规文法转换成正规式
上述过程的逆过程,最后只剩下一个开始符号定义的产生式,并且该产生式的右部不含非终结符,转换规则:
文法G[S]:
S→aA,S→a,A→aA,A→dA,A→a,A→d
S=aA|a,A=aA|dA|a|d=(a|d)A|(a|d)
A=(a|d)*(a|d)
S=a(a|d)*(a|d)|a=a((a|d)*(a|d)|ε)=a(a|d)*
练习:
有文法G[S]:
S→aS,S→aB,B→bC,C→aC,C→a
六、正规式和有穷自动机的等价性
正规表达式与有穷自动机等价,是指若给定一正则表达式,也即相应地给定了正则集合L(e),那么就可构造NFAM,并有L(M)=L(e);
反之,若给定一个DFAM,M接受的语言为L(M),则必然存在一正则表达式e,且L(e)=L(M)。
正规表达式和FA是定义语言(符号串集)的两种不同形式。
同一个语言,既可用FA描述,也可用正规表达式描述。
七、正规表达式到NFA的转换
先构造一个NFAM的一个广义转换图,其中,只有S与Z两个状态,S是开始状态,Z是终止状态,弧上是正规表达式e。
然后,按照下图所示的替换规则对正规表达式e逐步进行分解,直到转换图中所有的弧上都是∑中的单个符号或ε为止。
(1)替换成
(2)替换成
(3)替换成
有∑={a,b}上的正规式R=(a|b)*abb构造NFAM使L(M)=L(e)。
构造与∑={a,b}上的正规式(a|b)*(aa|bb)(a|b)*等价的自动机。
八、NFA到正规表达式的转换
对于一个具有输入字母表∑的NFAM,在∑上也可以构造一个正规表达式e,使L(e)=L(M)。
具体操作如下:
①首先,对NFAM进行拓广,在M的状态转换图中,新设置一个唯一的开始状态S和唯一的终止状态Z,并允许状态转换图中弧上可以为正规表达式。
②然后,从开始状态S到原来所有的开始状态连接ε弧,再从原来所有的终止状态到Z状态也连接ε弧。
修改后,构成了一个新的NFA,它只有一个初态结点S和一个终态结点Z,这个新的NFAM′显然和原NFAM等价。
③接着,利用下图所示的替换规则,逐步消去M′中属于M的所有结点和有关连线,直到状态转换图中只剩下状态S和Z为止(这个过程称为消结)。
在消结过程中,用相应的正规表达式标记连线。
(2)替换成
(3)替换成
NFAM=({0,1,2,3,4},{a,b},f,{0},{2,4}),状态图如下,构造正规式R使L(R)=L(M)。
3.5DFA在计算机中的表示
对于一个DFA=(Q,∑,t,q0,F),如果给出了它的映射t:
Q×
∑→Q,那么,这个DFA实际上也就确定了。
因此,要在计算机中表示一个DFA,只需在计算机中表示它的映射。
一、矩阵表示法
DFA的映射t:
∑→Q,可表示成t(q,a)=q’,其中,q,q’Q,a∑。
映射t(q,a)=q’,在计算机中自然可用矩阵来表示,其中,状态q作为矩阵的行,输入字母a作为矩阵的列,映象q’作为矩阵元素t(q,a)的值。
将状态集Q中的所有状态排一个序:
q0,q1,q2,…,qn;
输入字母表∑中的所有字母也排一个序:
a1,a2,…,am。
设M是一个二维数组,若t(qi,qj)=qk,则令M[i,j]=k,其中,i,k=0,1,2,…,n;
j=1,2,…,m。
二、表结构
∑→Q,在计算机中可表示成一种表结构。
在这个表结构中,每一个状态对应一个表,表中包括该状态的状态名、从该状态发出的弧数、每条弧上的标记(输入字母)以及弧达到的状态所在表的首地址。
若给定一个状态和输入符号,则可以直接在表中先查找到该状态所在的表项,进而在该表项中找到输入符号,按照其对应的(语义)动作的链接,前进到下一个状