我在脚本中找到了一个DFA(确定性有限自动机)的状态图及其RegEx,但这个图只是一个没有任何解释的示例。所以我试图自己从DFA状态图中导出RegEx并获得表达式:ab+a+b(a*b)*
。我不明白我是如何得到脚本中提到的原始RegEx (ab+a*)+ab+
的。在这里我的推导:
我很感激任何帮助,链接,参考和提示!
答案 0 :(得分:2)
您在这里正确地派生了正则表达式。您拥有ab+a+b(a*b)*
的表达式相当于(ab+a*)+ab+
- 一旦您完成了DFA状态消除(您从启动状态到接受状态只有一次转换),就不会有(ab+a*)+ab+
。任何更多的派生。但是,根据您消除状态的顺序,您可能会获得不同的最终正则表达式,并且假设您正确执行了抵销,它们都应该有效。状态消除方法也不能保证能够为特定DFA生成所有等效的正则表达式,因此您没有完全达到原始正则表达式。你也可以check the equivalence of two regular expressions here。
对于您的特定示例,虽然要显示此DFA与此原始正则表达式(ab+a*)+ab+
相同,但请查看此消除状态下的DFA(在第二步和第三步之间的某个位置'如上所示):
让我们将表达式(ab+a*)(ab+a*)*ab+
扩展为(ab+a*)
。因此,在DFA中,第一个a*
让我们从状态0到状态2和3之间的中途(a*a
中的(ab+a*)*
)。
然后下一部分(ab+a*)
表示我们允许拥有0个或更多ab+
个副本。如果有0份副本,我们将以a
完成,从a*a
过渡的后半部分读取b
,从2到3和{{1}从3到4过渡,让我们处于接受的状态4,我们可以在这里接受自我循环,并根据需要阅读尽可能多的b
。
否则,我们会有一份或多份(ab+a*)
的副本,再次从a
过渡的后半部分读取a*a
,从{2}转换为b
3到4过渡。 a*
来自状态4的a*ab
自循环的前半部分,而后半部分ab
来自正则表达式的最终ab+
或另一个副本的开头(ab+a*)
。我不确定状态消除是否恰好达到了(ab+a*)+ab+
的表达式,但是对于它的价值,我认为你得到的正则表达式更清楚地捕获了这个DFA的结构。