NFA使用子集法转成DFA之后,DFA不是最简洁的版本,可以进行下一步的化简。
思路:将 DFA 的状态集划分为不相交的子集,使不同的两个子集的状态可区别,同一个
子集的状态都等价。即将等价的状态合在一起。
例子:
方法:将状态集S划分为两个子集,终态集和非终态集。
即Π0={{1,2,3,4},{5,6,7}},1234是非终态,567是终态。
因为{1,2,3,4}a={6,7,1,4},{1,2,3,4}接收a之后得到的状态是{6,7,1,4},不全包含在 Π0的子集中,不是Π0的一个子集,所以需划分。
又因为{1,2}a={6,7}落在{5,6,7}集合中, {3,4}a={1,4}落在{1,2,3,4}集合中,所以a可以将{1234}中的{12}和{34}区分开,所以得Π1={{1,2},{3,4},{5,6,7}}。
因为{3,4}a={1,4},不全包含在Π1的 子集中,需划分为{3},{4}得:
Π2={{1,2},{3},{4},{5,6,7}}。
因为{5,6,7}a={7,4},所以 Π3={{1,2},{3},{4},{5},{6,7}}。
到这里,已经将初始的集合从2个子集{567}、{1234}划分成5个子集{1,2},{3},{4},{5},{6,7}了,这5个集合中的元素是等价的,即12是等价的,67是等价的,只需要保留一个,可以删除2和7,删除的过程中需要注意:
删除某一个结点时,可能需要补一些线,使得整体的功能不变,由于6和7是等价的,所以删除2时,2和 7有的线,只要1和6有,那么就不需 要添加新的线,但是删除7的时候, 由于存在5到7,但是没有5到6,所以所以需要补充一 条线,即5到6,图中的红线。
然后将2和7,以及它们相关的线条删除,剩下的5个状态13456,可以重新命名为12345,只要保持形状不变就行,某个状态具体的名字是1还是3并不是很重要,美观起见,化简的最后,重新从1开始命名。