我正在使用JFLAP将DFA转换为RE语言
"偶a
和奇数b
"
这最后一步对我来说并不清楚如图所示如何获得最终的RE
最终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)一词,为什么它在最终表达中有明星
答案 0 :(得分:1)
我已经在图表中重新标记了NFA的转换,因此解释更简单。
这样做会留下正则表达式:
(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的行动:
通过枚举你可以留在q0的所有方法,你基本上摆脱了从q1到q0(R4)的过渡。换句话说,你在我的正则表达式的这一部分之后说,如果你进入状态q1,就没有办法回到q0(如果它会被正则表达式的第一部分捕获)。所以你的NFA现在看起来像这样:
所以你最后的正则表达式是,按照保持在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)*
。我实际上认为带或(+)的版本更清晰,但只要它有效就没关系。