如何将循环重叠的NFA转换为正则表达式?


11

如果我理解正确,NFA具有与正则表达式相同的表达能力。通常,从NFA中读取等价的正则表达式很容易:您将循环转换为恒星,将交汇处转换为替代物,等等。但是在这种情况下该怎么做:

在此处输入图片说明
[ 来源 ]

重叠的循环使得很难看到此自动机接受什么(就正则表达式而言)。有把戏吗?


2
如果您可以在图表中指出初始状态和最终状态,那就太好了:指向初始状态的小箭头和作为最终状态的双圆圈。另外,如果您不给出任何尝试的迹象,就很难知道您要去哪里。
戴夫·克拉克2012年

也许该文档可以为您提供帮助:它清楚地说明了如何将NFA转换为RE。
2012年

1
为什么很难?您是否尝试过一种规范算法?您能做的最好的ansatz是什么?
拉斐尔

3
我进行了编辑,以使问题(imho)有趣且对本站点有益。查看修订历史以形成意见。
拉斐尔

1
我已经准备好将您的NFA转换为正则表达式的答案,但是我删除了它:Raphael的答案为您提供了需要自己完成的方法(它还提供了示例链接),因此如果您愿意,可以进行一些练习。想。如果您仍然需要我的解决方案,我将取消删除答案。
亚历克斯(Alex)10 Brink 2012年

Answers:


5

而不是“阅读”,您应该采用几种规范方法之一来执行此操作。到目前为止,我所看到的最好的方法是将自动机表示为可以解决的(常规)语言的方程组。它特别好,因为它似乎比其他方法产生更简洁的表达式。

去年夏天,我写了这份文件,向学生解释了该方法。它直接与特定的讲座有关;提到的参考文献是正则表达式的典型定义。包含Arden引理的证明(需要的结果);缺少一种方法的正确性。不幸的是,据我在演讲中了解到的,我没有参考。

简而言之:对于每个状态,创建等式qi

Qi=qiaqjaQj{{ε}, qiF, else

其中是最终状态的集合,表示从到标有过渡。如果您将读为或(取决于您的正则表达式定义),则会看到这是一个正则表达式的等式。Fqiaqjqiqja+

解决这个问题(使用Arden引理)为每个状态生成一个正则表达式,精确描述从开始可以接受的单词;因此,(如果是初始状态)是所需的表达式。QiqiQ0q0

保留给定自动机的应用程序作为练习;上面的链接文档中包含一个完整的示例。

另请参阅此处我张贴类似答案的地方。


1
有关其他常规方法,请参见此参考问题
拉斐尔

3

如果只有一串没有循环的状态,您知道该怎么做吗?

如果存在一个没有此重叠分支的简单循环,您知道该怎么办吗?

(如果答案为“否”,请首先考虑这些情况。)

现在,我们的想法是逐步转换自动机,使其处于一种形式,在其中您可以发现这些模式:链,循环和最终会聚的分支路径(导致交替)。在转换的每个步骤中,请注意,转换后的自动机仍然可以识别相同的语言。

请记住,这是一个 -deterministic自动机。您发布的内容恰好是确定性的,但在进行转换时并不一定要那样做。

由于粘性点是可以从两个不同的点到达,因此将其分成两部分。保持,删除从到的过渡,并添加一个新的状态其中包含过渡。现在您应该能够发现一个模式。q 1 f q 2 g q 3 q 4 q 2 q 5 q 4 j q 5 g q 3q2q1fq2gq3q4q2q5q4jq5gq3

如果此时仍然遇到问题,请注意涉及的循环对应于一个简单的正则表达式。到达,您可以根据需要在此循环中进行尽可能多的运行。在某种意义上(可以理解为技术上),您可以用正则表达式替换状态。q 3 q 3h j g *q3,q4,q5q3q3(hjg)

注意检查哪些状态是最终状态。首先可以不必担心,并做一个大的循环,然后复制在循环中途终止的零件。

这不一定是最有效的技术,也不是生成最简单的正则表达式的技术,但它很简单。


3

拆分q_1


这就回答了问题如何?
拉斐尔

1
如果以这种方式重写状态机,那么读取等效的正则表达式将变得很简单。
Jukka Suomela 2012年

1
也许您应该将此内容包含在答案文本中。这总是有效吗?
拉斐尔

@Raphael:在这种情况下有效。:)这个技巧背后的总体思路如下:我们将循环设置为“正确嵌套”。也就是说,我们没有周期结构,[(])但是[()]
Jukka Suomela 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.