理论上可以证明,每一个正则集合可以由一个状态数最小的DFA识别,且这个DFA是唯一的。本博客将介绍如何把一个DFA的状态数化简到最小,而不影响接受的语言。
化简的DFA:当且仅当它没有多余状态并且它的状态集中没有两个状态是相互等价的。
等价状态:是指对于DFA中所有状态s和t,对于所有输入符号c,存在Ic(s)=Ic(t),即状态s,t具有相同的后继,则称s和t是等价的。
状态s和t等价的条件是:
(1)一致性条件:状态s和t必须同时为接受状态和不接受状态。(是否属于终止状态集)
(2)蔓延性条件:对于所有输入符号,状态s和t必须转换到等价状态里。
下面介绍一种具体的DFA化简方法——分割法。
Sample:
已知一个确定的有穷自动机M=({0,1,2,3,4,5}, {a,b}, δ, 0, {0,1}),其中δ见表
状态 | a | b |
---|---|---|
0 | 1 | 2 |
1 | 1 | 4 |
2 | 1 | 3 |
3 | 3 | 2 |
4 | 0 | 5 |
5 | 5 | 4 |
Step 1:
根据一致性条件,将状态分为两类。0,1属于终止状态集,归为一类,其他归为另一类。
状态 | a | b | 类别 |
---|---|---|---|
0 | 1(A) | 2(B) | A |
1 | 1(A) | 4(B) | A |
2 | 1(A) | 3(B) | B |
3 | 3(B) | 2(B) | B |
4 | 0(A) | 5(B) | B |
5 | 5(B) | 4(B) | B |
Step 2:
根据蔓延性条件,对状态进行再分类。由上图可以看出:2,4属于同一类;3,5属于另一类。
状态 | a | b | 类别 |
---|---|---|---|
0 | 1(A) | 2(B) | A |
1 | 1(A) | 4(B) | A |
2 | 1(A) | 3(C) | B |
3 | 3(C) | 2(B) | C |
4 | 0(A) | 5(C) | B |
5 | 5(C) | 4(B) | C |
然后我们再进行检查,发现A,B,C三类中状态都已等价(每一个状态都有相同的后继)。如果不等价,则按照刚才方法进行再分。
所以我们得到的最小化DFA为M'=({A,B,C}, {a,b}, δ,A,{A}),其中δ见表
状态 | a | b |
---|---|---|
A | A | B |
B | A | C |
C | C | B |