对于上面的自动机,我的教科书中给出的正则表达式如下:
a*(a*ba*ba*ba*)*(a+a*ba*ba*ba*)
我无法得到这个...以下是我的尝试:
aa* + aa*(ba*ba*ba*)* + ba*ba*ba* + ba*ba*ba*(ba*ba*ba*)*
要么我错了,要么我无法将其简化为书中给出的形式。有人可以在这里指导我,指出错误或一步一步向我解释?
我真的非常感谢和欣赏。
答案 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的热爱并提交!!!