将DFA转换为RE

时间:2016-12-25 23:43:14

标签: regex regular-language finite-automata dfa

我正在使用JFLAP将DFA转换为RE语言

"偶a和奇数b"

enter image description here

这最后一步对我来说并不清楚如图所示如何获得最终的RE

DFA

最终RE

((ab(bb)*ba+aa)*(ab(bb)*a+b)(a(bb)*a)*(a(bb)*ba+b))*(ab(bb)*ba+aa)*(ab(bb)*a+b)(a(bb)*a)*

我的疑惑是在a(bb)*ba+b(Q1到Q0)一词,为什么它在最终表达中有明星

1 个答案:

答案 0 :(得分:1)

我已经在图表中重新标记了NFA的转换,因此解释更简单。

enter image description here

这样做会留下正则表达式:

 (R1* R2 R3* R4)* R1* R2 R3*

第一个带括号的部分实质上描述了一系列步骤,使您从q0回到q0。正则表达式说,你可以随心所欲地做到这一点,当你完成任务时,你可以按照R1多次按照你想要的状态q0并且当你真的搞砸了,按照R2进入最终状态,您可以根据需要循环R3

这不是让国家将NFA排除在正则表达式中的最新或最直观的方式,但我认为这是正确的。希望这个解释是有道理的。如果没有,请在评论中提问!

作为参考,我写了我想出的正则表达式。注意我用|而不是像你一样。

(aa|ab(bb)*ba)* (ab(bb)*a|b) ((a(bb)*a)* ((a(bb)*ba|b)(aa|ab(bb)*ba)*(ab(bb)*a|b))*)*

编辑:

您希望正则表达式捕获所有可能的模式,最终将从状态q0开始引导您进入最终状态。现在假设你站在q0状态。你可以采取什么行动?你可以将你的行动分为那些让你处于q0状态和那些能让你进入q1的行动。

让您进入q0的行动:

  • 关注R1
  • 跟随R2,在q1中做任何乱七八糟的事情,然后按照R4回到q0。让我们称之为正则表达式R2_R4,其中需要填充我们可以在q1中执行的所有操作,除非通过R4返回。那么q1我们唯一可以做的就是跟随R3多次,所以我们用R2R3 * R4替换空白。

通过枚举你可以留在q0的所有方法,你基本上摆脱了从q1到q0(R4)的过渡。换句话说,你在我的正则表达式的这一部分之后说,如果你进入状态q1,就没有办法回到q0(如果它会被正则表达式的第一部分捕获)。所以你的NFA现在看起来像这样:

enter image description here

所以你最后的正则表达式是,按照保持在q0的转换,然后通过R2转到q1,并且只要你想要跟随R3就保持在q2。所以你的正则表达式看起来像:

 (R1 + R2R3*R4)* R1* R2 R3*

实际上相当于你拥有的那个:

 (R1* R2 R3* R4)* R1* R2 R3*

因为(R1+R2 R3* R4)*的性质或等同于(R1* R2 R3* R4)*。我实际上认为带或(+)的版本更清晰,但只要它有效就没关系。