理解(和形成)这个有限自动机的正则表达式

时间:2012-01-12 18:12:02

标签: regex finite-automata regular-language automata

enter image description here

对于上面的自动机,我的教科书中给出的正则表达式如下:

a*(a*ba*ba*ba*)*(a+a*ba*ba*ba*)

我无法得到这个...以下是我的尝试:

aa* + aa*(ba*ba*ba*)* + ba*ba*ba* + ba*ba*ba*(ba*ba*ba*)*

要么我错了,要么我无法将其简化为书中给出的形式。有人可以在这里指导我,指出错误或一步一步向我解释?

我真的非常感谢和欣赏。

2 个答案:

答案 0 :(得分:2)

教科书似乎是正确的。一步一步地采取行动:

  

A *(A *

如果正则表达式的这一部分为真(换句话说,你确实在'a'中读过),你将转到状态3.继表达式的其余部分:

  

BA *

会让你处于状态2,

  

BA *

状态4和

  

BA *

会让你回到状态3。

现在,假设您在a*(a*期间未阅读“a”,阅读下一个b会将您转移到州2.然后您最终处于与之前完全相同的状态,并且通过跟随其余的a*ba*ba*),你最终回到状态3。

由于您现在回到状态3,因此(a*ba*ba*ba*)*部分可以执行任意次数,因为这与我们的第一个场景(您在{a期间'a'中读取)完全相同{1}})。

第二部分再次简单解释了第一个场景,你必须至少阅读一个'a',然后其余部分是相同的。

希望这有帮助,让我知道它是否仍然没有意义。不知道我的解释是否太清楚了。

答案 1 :(得分:2)

检查一下。它提出了三种很好的算法方法来回答这些问题。如果你有时间或倾向,可以学习其中一个或三个。状态删除是相当直观的,虽然我喜欢Kleene的传递闭包方法。

http://krchowdhary.com/toc/dfa-to-reg-exp.pdf

编辑:您的RE等同于提供的RE。这是他们的减少:

0. a*(a*ba*ba*ba*)*(a+a*ba*ba*ba*)

1. = a*(a*ba*ba*ba*)*a + a*(a*ba*ba*ba*)*a*ba*ba*ba*

2. = a*(ba*ba*ba*)*a + a*(ba*ba*ba*)*ba*ba*ba*

3. = a*a + a*(ba*ba*ba*)*a + a*(ba*ba*ba*)*ba*ba*ba*

4. = aa* + a*(ba*ba*ba*)*ba*ba*ba*a + a*(ba*ba*ba*)*ba*ba*ba*

5. = aa* + a*(ba*ba*ba*)*ba*ba*ba*

6. = aa* + aa*(ba*ba*ba*)*ba*ba*ba* + (ba*ba*ba*)*ba*ba*ba*

7. = aa* + aa*(ba*ba*ba*)* + (ba*ba*ba*)*ba*ba*ba*

8. = aa* + aa*(ba*ba*ba*)* + ba*ba*ba* + (ba*ba*ba*)*ba*ba*ba*

9. = aa* + aa*(ba*ba*ba*)* + ba*ba*ba* + ba*ba*ba*(ba*ba*ba*)*

步骤1是正确的,因为r(s + t)= rs + rt。

第2步是正确的,因为r *(r * sr *)* = r *(sr *)*。

如果L(s)是L(r)的子集,则步骤3是正确的,因为r = r + s。

步骤4是正确的,因为r * r = rr *和rs + rq * s = rs + rqq * s。

步骤5是正确的,因为rs + r = r。

步骤6是正确的,因为r * s = rr * s + s。

步骤7是正确的,因为rs + rqq * s = rs + rq * s。

如果L(s)是L(r)的子集,则步骤8是正确的,因为r = r + s。

步骤9是正确的,因为r * r = rr *。

请随时提出任何问题或指出我可能犯的任何错误。

EDIT2:如果您对这些问题感兴趣,可以通过此链接显示对新计算机科学StackExchange的热爱并提交!!!

http://area51.stackexchange.com/proposals/35636/computer-science-non-programming?referrer=rpnXA1_2BNYzXN85c5ibxQ2