这个有限自动机的正则表达式是什么?

时间:2014-09-25 16:22:07

标签: regex regular-language finite-automata

Finite automaton

我从来没有在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显然可以。

1 个答案:

答案 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)*

不是一个简单的正则表达式