【编译原理学习笔记】4:从NFA构造等价DFA,对DFA的化简

对NFA的考量是困难的,对DFA的考量则是无比清晰的。对于一个NFA,总存在一个与其等价的DFA。这里"等价"指的是这两个有穷自动机的正规集是相同的。

ε-closure(…)和more(…,…)

在NFA中,ε-closure(A)指的是从状态A经若干ε弧能达到的状态,也包括A自己。more({A,B,C},a)指的是所有从{A,B,C}里的状态经过一次a弧所能到达的状态。

从NFA构造等价DFA

注意,因为从NFA构造等价DFA的时候,其中的状态会出现新的,不妨把NFA中的状态用数字表示,把构造出的等价DFA中的状态用大写字母表示。
这里写图片描述
先作初态扩张,因为NFA可能有多个初态,而DFA只可以有一个初态,所以要把NFA所有的初态放在一个集合里,并求这个集合的ε-closure得到等价的DFA的初态。

观察知这个有限自动机上的状态转移弧可以是a或者b,所以从得到的DFA的初态(NFA初态的ε-closure),要看其走a(走b)能到达哪些NFA状态,即先求它们对a(对b)的more再对得到的more求ε-closure,这些NFA状态放在一个集合里也就是走a(走b)到的DFA状态,对于新产生的DFA状态,再用同样的方法向下走,直到没有新的状态产生为止。

为了清晰,为产生的DFA状态署名,这样后面画DFA状态图也好画。如上图那个NFA构造出的DFA状态转移的矩阵表示:

当前状态走a弧之后走b弧之后
S={1,2}{1,3,2}=A{1,4,2}=B
A={1,2,3}{1,3,5,2,6,7}=C{1,4,2}=B
B={1,2,4}{1,3,2}=A{1,4,5,2,6,7}=D
C={1,2,3,5,6,7}{1,3,5,2,6,7}=C{1,4,6,2,7}=E
D={1,2,4,5,6,7}{1,3,6,2,7}=F{1,4,5,6,2,7}=D
E={1,2,4,6,7}{1,3,6,2,7}=F{1,4,5,6,2,7}=D
F={1,2,3,6,7}{1,3,5,6,2,7}=C{1,4,6,2,7}=E

从上表即可得出转换后的DFA,注意带有原来NFA中终态的DFA状态都是终态
这里写图片描述
此外可以将FA的多余状态去掉,即从开始状态出发经过任何输入串也无法到达的状态,这样的状态不具有识别价值。

对DFA的化简

得到DFA之后,去除冗余状态,但这样的自动机中还是可能会有本质上重复的状态,会干扰对DFA的探究。

如有DFA:
这里写图片描述
在考量等价的状态时,不用去管是不是初始状态。首先,因为非终态和终止状态一定不可能是等价的状态,所以暂时可以划分成这样的两组状态:

{q1,q2},{q0,q3}

然后再分别对组内的状态转移进行审查,在第一组中:

(q1,1)->q0	(q2,1)->q3
(q1,0)->q3	(q2,0)->q0

只要状态转移也全部等价,那么两个状态就是等价的。所以要只要q1和q2是否真的等价,从上面的审查中可以看出只要去看q0和q3是否等价,这正好是要审查的第二组状态:

(q0,1)->q1	(q3,1)->q2
(q0,0)->q2	(q3,0)->q1

可以看出,q3和q0是否等价又取决回q1和q2是否等价。当构成这样的互相依赖的情况时,只要认为一方等价,则可以为两方各自等价。因此可以划分出两个新的状态:

A={q1,q2}	B={q0,q3}

包含了之前的终止状态的新状态是新的终止状态,包含了之前的起始状态的新状态是起始状态,所以终止状态是B,起始状态是B,故化简后的DFA是:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值