这是正确的NFA图吗?

时间:2018-10-07 14:10:16

标签: finite-automata formal-languages nfa

任务:根据给定的正则表达式构建NFA。

我决定将一些旧程序推送到GitHub。特别是关于形式语言理论的问题。测试代码后,我得到了这个结果,我无法真正分辨出这是一个错误还是正确的输出。看起来有点不错,但汤普森算法无法输出。这些小循环看起来也很可疑。他们基本上什么也不做。 Input example and graph that I get

2 个答案:

答案 0 :(得分:1)

绝对错误。

在我看来,epsilon-self-loops像是对联合运算符的处理中的错误。从联合中的每个最终状态到新的最终状态应该有一个epsilon过渡,所以我猜测您混合了epsilon链接。我不确定在一种情况下您如何在a上获得正确的epsilon转换,而在另一种情况下如何获得b上的正确epsilon转换,因此该错误可能更复杂。

您是对的,在这种情况下,ε自环没有任何危害。但是,很有可能从联结腿的末端到联结的结束状态缺少epsilon链接会导致(a*|b)(a|b*)出现问题。实际上,其中之一可能会识别出(a|b)+

此外,您的Kleene star实施不允许零重复。您拥有的是(a|b)+,而不是(a|b)*,因为从起始状态到星形子构造的状态没有ε过渡。

答案 1 :(得分:0)

我的用于DFA最小化的Brzozowski算法的C#实现提供了以下DFA。 (0)是初始状态,(2)和(3)是最终状态。

DFA for (a|b)*b(a|b)