如果我理解正确,NFA具有与正则表达式相同的表达能力。通常,从NFA中读取等价的正则表达式很容易:您将循环转换为恒星,将交汇处转换为替代物,等等。但是在这种情况下该怎么做:
[ 来源 ]
重叠的循环使得很难看到此自动机接受什么(就正则表达式而言)。有把戏吗?
如果我理解正确,NFA具有与正则表达式相同的表达能力。通常,从NFA中读取等价的正则表达式很容易:您将循环转换为恒星,将交汇处转换为替代物,等等。但是在这种情况下该怎么做:
[ 来源 ]
重叠的循环使得很难看到此自动机接受什么(就正则表达式而言)。有把戏吗?
Answers:
而不是“阅读”,您应该采用几种规范方法之一来执行此操作。到目前为止,我所看到的最好的方法是将自动机表示为可以解决的(常规)语言的方程组。它特别好,因为它似乎比其他方法产生更简洁的表达式。
去年夏天,我写了这份文件,向学生解释了该方法。它直接与特定的讲座有关;提到的参考文献是正则表达式的典型定义。包含Arden引理的证明(需要的结果);缺少一种方法的正确性。不幸的是,据我在演讲中了解到的,我没有参考。
简而言之:对于每个状态,创建等式
其中是最终状态的集合,表示从到标有过渡。如果您将读为或(取决于您的正则表达式定义),则会看到这是一个正则表达式的等式。
解决这个问题(使用Arden引理)为每个状态生成一个正则表达式,精确描述从开始可以接受的单词;因此,(如果是初始状态)是所需的表达式。
保留给定自动机的应用程序作为练习;上面的链接文档中包含一个完整的示例。
另请参阅此处我张贴类似答案的地方。
如果只有一串没有循环的状态,您知道该怎么做吗?
如果存在一个没有此重叠分支的简单循环,您知道该怎么办吗?
(如果答案为“否”,请首先考虑这些情况。)
现在,我们的想法是逐步转换自动机,使其处于一种形式,在其中您可以发现这些模式:链,循环和最终会聚的分支路径(导致交替)。在转换的每个步骤中,请注意,转换后的自动机仍然可以识别相同的语言。
请记住,这是一个非 -deterministic自动机。您发布的内容恰好是确定性的,但在进行转换时并不一定要那样做。
由于粘性点是可以从两个不同的点到达,因此将其分成两部分。保持,删除从到的过渡,并添加一个新的状态其中包含过渡。现在您应该能够发现一个模式。q 1 f → q 2 g → q 3 q 4 q 2 q 5 q 4 j → q 5 g → q 3
如果此时仍然遇到问题,请注意涉及的循环对应于一个简单的正则表达式。到达,您可以根据需要在此循环中进行尽可能多的运行。在某种意义上(可以理解为技术上),您可以用正则表达式替换状态。q 3 q 3(h j g )*
注意检查哪些状态是最终状态。首先可以不必担心,并做一个大的循环,然后复制在循环中途终止的零件。
这不一定是最有效的技术,也不是生成最简单的正则表达式的技术,但它很简单。
[(])
但是[()]
。