我第二年和第二年是计算机科学专业的学生,我们得到了一个不确定的有限自动机,并询问它接受什么单词。
我尝试将其简化为确定性有限自动机,并得出以下结论:
我断言是不接受b *或a或a(b + ab * a)*格式的任何单词,无法弄清楚它们之间的共同点和接受的单词,我对此非常了解,它与整个单词无关,仅与开头无关,因为如果单词以a开头,则可以具有a和b的任意组合,并且将被接受并不重要。
非常感谢您的帮助。
答案 0 :(得分:0)
首先,我将以自己的方式回答问题。然后,我将解决您转换为确定性有限自动机的问题。
我们可以编写一组方程式并求解q2以查看正则表达式导致该状态的原因。考虑以下系统:
(q1) = (q2)a + e
(q2) = (q1) + (q3)(a + b)
(q3) = (q1)a + (q3)b
我们要解决导致接受状态的原因,所以让我们首先消除不接受状态:
(q1) = (q2)a + e
(q2) = (q2)a + e + (q3)(a + b)
(q3) = (q2)aa + a + (q3)b
要消除(q3),我们可以使用规则(x)= r +(x)s <=>(x)= rs *,然后替换为:
(q1) = (q2)a + e
(q3) = ((q2)aa + e)b*
(q2) = (q2)a + e + ((q2)aa + a)b*(a + b)
= (q2)a + e + (q2)aab*(a + b) + ab*(a + b)
= (q2)[a + aab*(a + b)] + [e + ab*(a + b)]
= (e + ab*(a + b))(a + aab*(a + b))*
= (e + ab*(a + b))(a(e + ab*(a + b)))*
我们恢复的正则表达式基本上描述了这一点:
通过空过渡或经过q3来到达q2;然后,通过转到q1并重复第一部分来返回q2。您可以根据需要多次执行此操作。
您如何编写系统?
要确定有限自动机,请考虑状态的每个子集,并随需添加过渡。我们从仅包含初始状态的子集{q1}开始。
/------------------------------------\
| __ |
V / \ |
{q1} -a-> {q1,q3} -a-> {q1,q2,q3} a |
| | | ^__/ |
b b b |
| __ | | |
V / V V | |
{ } b {q2,q3} <--------/ |
^ \__/ \ |
| \-a->{q1,q2}-----a----/
| |
\----------b----------/
添加状态和转换的规则是:
注意:在上面的自动机中,我没有显示死态{}上的过渡。所有源自死态的转换都将以死态终止。
我的{q1}类似于您的最高处(OK)。我的{}与您的HOLE类似。我的{q1,q3}类似于您的NOT。我的{q2,q3}类似于您最右边的OK。
但是-我的{q1,q2,q3}与您最底层的OK并不相似。为了使自己像我的,在符号b上添加从最底下的OK到最右边的OK的过渡。
请注意,我的{q1,q2}是多余的,等效于我的{q1}; {q1,q2}之外的所有过渡与{q1}之外的所有过渡相同。确实,由于从q1到q2的电子转换,我应该将{q1,q2}设为初始状态,但是无论如何-您会明白的。
您的DFA可能不正确的原因是,在NFA中,总是有机会“吹牛”并最终陷入困境。在您的自动机中,可以转到最底端的“确定”,然后进行设置。