编译原理 正则表达式_确定有穷自动机(DFA)_化简(最小化)

1. 编译原理-确定有穷自动机(DFA)化简(最小化)

预备

最简化的DFA:这个DFA没有多余状态、也没有两个相互等价的状态。一个DFA可以通过消除无用状态、合并等价状态而转换成一个与之等价的最小状态的有穷自动机。
无用状态:从自动机开始状态出发,任何输入串也发到达的那个状态,或者这个状态没有通路可达终态。
等价转态:两个状态,识别相同的串,结果都同为正确或错误,这两个状态就是等价的。
区别状态:不是等价状态。

化简DFA

分割法:

把一个DFA(不含多余状态)的状态分割成一些不相交的子集,并且任意两个子集之间的状态都是可区别状态,同一子集内部的状态都是等价状态。

步骤(按分割法)

  • I0 = 非状态元素构成的集合,I1 = 终态元素构成的集合
  • 经过多次划分后,要保证,任意一个Ik中的元素通过move(Ik,某个字符)的结果都同属于一个Iz,这时候划分完成。否则把状态不同的单独划分出去。
  • 重复上一步,直至没有新的I子集增加。
  • 从子集中任选一个代替整体,画出最简DFA。

例1. 将下图DFA M最小化

在这里插入图片描述

分割成I0,I1
I0 = {1,2,3,4} ; 非终态

I1 = {5,6,7} ; 终态
检验I0中元素的等价性,不等价就分割
move(1,a) = 6 ∈I1

move(1,b) = 3 ∈I0

move(2,a) = 7 ∈I1

move(2,b) = 3 ∈I0

move(3,a) = 1 ∈I0

move(3,b) = 5 ∈I1

move(4,a) = 4 ∈I0

move(4,b) = 6 ∈I1

可以发现,{1,2}是等价的,{3,4}是等价的

所以现在分割成了:I2 = {1,2}, I1 = {5,6,7}, I3 = {3,4}

检测I2中元素的等价性,不等价就分割
move(1,a) = 6 ∈I1

move(1,b) = 3 ∈I3

move(2,a) = 7 ∈I1

move(2,b) = 3 ∈I3

可以发现,是等价的,不用分割
检测I3中元素的等价性,不等价就分割
move(3,a) = 1 ∈I2

move(3,b) = 5 ∈I1

move(4,a) = 4 ∈I3

move(4,b) = 6 ∈I1
可以发现,不是等价的,分割成{3},{4}

所以现在分割成了:I2 = {1,2}, I1 = {5,6,7}, I4 = {3}, I5 = {4}

检测I1中元素的等价性,不等价就分割
move(5,a)  = 7 ∈ I1
move(5,b)  = 3 ∈ I4

move(6,a)  = 4 ∈ I5
move(6,b)  = 1 ∈ I2

move(7,a)  = 4 ∈ I5
move(7,b)  = 2 ∈ I2

可以发现,不是等价的,分割成{6,7}, {5}

所以现在分割成了:I2 = {1,2}, I4 = {3}, I5 = {4}, I6 = {5},I7 = {6,7}

检测后发现,不可再分割,所以最终分割结果就是:I2 = {1,2}, I4 = {3}, I5 = {4}, I6 = {5},I7 = {6,7}

画转态转换图:从集合中选取一个代表就可以
在这里插入图片描述

例题2 编译原理作业题

构造一个DFA,它接受Σ = {0,1}上能被5整除的二进制数。另老师还要求写出能被5整除的二进制串的正规式。

解析:

首先分析题目可知,一个数除以5,其余数(十进制)只能是0,1,2,3,4五种,因此我们以0,1,2,3,4分别表示这五种状态。因为要求得能被5整除的数,0 mod 5=0满足要求,故状态0既为初始状态,又为终结状态。

接着,考虑二进制数在其串后增添0或1时,状态的转化情况。在二进制串后添1位,即可理解为将先前的串值乘以二再加上所添的数值。那么,串尾添数后新的数值模5的余数便可以计算出来。即可以得到添0或1后的新的状态。

下面根据分析列出状态转换表:

状态添0添1
001
123
240
312
434

根据状态转换表,可以绘制出DFA如下图所示:

的

再根据上面的DFA可以得出正规式如下:

{1 [ ((00|1)(01)*01*0)* (0|11) (01)* ] 1}* 0*

1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiangyong58

喝杯茶还能肝到天亮,共同进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值