编译原理——确定有穷自动机的化简-分割法

3.4.4 确定有穷自动机的化简

1.化简的有穷自动机的定义

一个没有多余状态并且没有两个状态是等价的有穷自动机。

多余状态(无用状态):从该自动机的开始状态出发,任何输入串也不能到达的那个状态

等价状态:

  1. 两个状态必须同时为可接受状态(终态)或者不可接受状态(非终态)——一致性条件
  2. 对于所有的输入符号,两个状态接受相同的符号必须转换到等价的状态——蔓延性条件

2.分割法

在这里插入图片描述

我们首先将其分为终态和非终态

在这里插入图片描述

P 0 P_0 P0 = ({1, 2, 3, 4}, {5, 6, 7})

接下来我们尝试先对{1, 2, 3, 4}这个子集进行划分

1 ⟶ a 6 1\stackrel{a}{\longrightarrow}6 1a6 1 ⟶ b 3 1\stackrel{b}{\longrightarrow}3 1b3

2 ⟶ a 7 2\stackrel{a}{\longrightarrow}7 2a7 2 ⟶ b 3 2\stackrel{b}{\longrightarrow}3 2b3

3 ⟶ a 1 3\stackrel{a}{\longrightarrow}1 3a1 3 ⟶ b 5 3\stackrel{b}{\longrightarrow}5 3b5

4 ⟶ a 4 4\stackrel{a}{\longrightarrow}4 4a4 4 ⟶ b 6 4\stackrel{b}{\longrightarrow}6 4b6

首先我们看如果输入a的话,1和2的输出为{5,6,7}这个集合中的元素,而3和4则仍是本集合的元素,所以根据等价状态的第二性质,我们可以将1、2 与3、4分割开。

在这里插入图片描述

P 1 P_1 P1 = ({1, 2}, {3, 4}, {5, 6, 7})

对于目前这个新的集合来说,我们继续划分每个子集。首先从{1,2}开始

1 ⟶ a 6 1\stackrel{a}{\longrightarrow}6 1a6 1 ⟶ b 3 1\stackrel{b}{\longrightarrow}3 1b3

2 ⟶ a 7 2\stackrel{a}{\longrightarrow}7 2a7 2 ⟶ b 3 2\stackrel{b}{\longrightarrow}3 2b3

我们无论是对1,2输入a还是输入b,它们的输出都属于同一个集合——6、7属于{5,6,7}这个终态集合,3属于{3,4}这个集合,所以{1,2}这个集合很完美,无法划分(即状态无法区分),它俩好得跟一个人似的。

在这里插入图片描述

那么我们继续看{3,4}

3 ⟶ a 1 3\stackrel{a}{\longrightarrow}1 3a1 3 ⟶ b 5 3\stackrel{b}{\longrightarrow}5 3b5

4 ⟶ a 4 4\stackrel{a}{\longrightarrow}4 4a4 4 ⟶ b 6 4\stackrel{b}{\longrightarrow}6 4b6

哦,我们看到,当输入a的时候,3输出的是1,属于{1,2}集合;4则输出的是4,属于{3,4}集合,所以3和4的状态可区分。

在这里插入图片描述

那么更新我们的状态图

在这里插入图片描述

更新P

P 2 P_2 P2 = ({1,2}, {3}, {4}, {5, 6, 7})

很明显我们的故事还没结束,还有{5,6,7}这个集合

5 ⟶ a 7 5\stackrel{a}{\longrightarrow}7 5a7 5 ⟶ b 3 5\stackrel{b}{\longrightarrow}3 5b3

6 ⟶ a 4 6\stackrel{a}{\longrightarrow}4 6a4 6 ⟶ b 1 6\stackrel{b}{\longrightarrow}1 6b1

7 ⟶ a 4 7\stackrel{a}{\longrightarrow}4 7a4 7 ⟶ b 2 7\stackrel{b}{\longrightarrow}2 7b2

很明显,在输入a的时候,5的输出为7即{5,6,7} 本集合内的,而6、7则是输出的同一个集合。二话不说,分家!

在这里插入图片描述

P 3 P_3 P3 = ({1,2}, {3}, {4}, {5}, {6, 7})

这时候,还剩{6,7},如果你上面看明白了,那么到这里你也就懂了,6、7是不可区分的状态。

分割法到此结束……

……不还有最后一步,把所有的不可区分状态统统用其中一个状态来表示就行。

比如1、2,我们直接用1来代替就行,把2所有的输入和输出的压力都放到1身上

在这里插入图片描述

1 ⟶ b 3 1\stackrel{b}{\longrightarrow}3 1b3 2 ⟶ b 3 2\stackrel{b}{\longrightarrow}3 2b3 所以这两个线用一个就行)

然后我们发现6、7可以直接用6代替

在这里插入图片描述

把虚线收拾干净再看看

在这里插入图片描述

在这里插入图片描述

3.The End

在这里插入图片描述

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’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值