我从来没有在fa上用两个最终状态进行转换。
我该怎么办?
我应该摆脱其他最终状态吗?
我摆脱了q3而且我得到了
(a*b(aa)*bb*ab)*
或者我应该替换和kleene明星q1到q3和q1到q3到q1?
如果我这样做,我会得到
(a*b(aa)*bb* + a*b(aa)*bb*ab)*
由于交替的左侧可以在q3中结束而另一个在q1中结束,因此它是接近的。但话说回来,仍然存在正则表达式不接受简单的'a'的问题,即使fa显然可以。
答案 0 :(得分:0)
要处理多个接受状态,请将DFA拆分为多个DFA,每个DFA与原始DFA相同,但只有一个接受状态(原始DFA中每个接受状态一个DFA)。现在(独立地)简化每个DFA(组合相同的状态并消除无用的状态)并为每个DFA创建一个正则表达式。原始DFA的正则表达式将是所有这些正则表达式的连接(与|
组合)。
所以在你的情况下,你将有两个DFA,一个只有q0接受,一个只有q3。在第一个中,q1和q3是冗余的(相同的状态转换),因此您可以将q3组合到q1中(为您提供3状态DFA,其中q1在b
上循环)。正则表达式是:
(a | b(b|aa)*b)*
仅使用q3的DFA的正则表达式更加棘手。首先找到q3的路径:
a*b(aa|aba*b)*b
然后从q3追加循环:
(b | a(a|ba*b)(a(a|ba*b))*b)*
把所有这些放在一起:
(a|b(b|aa)*b)* | a*b(aa|aba*b)*b(b|a(a|ba*b)(a(a|ba*b))*b)*
不是一个简单的正则表达式