我需要通过将DFA(确定性有限自动机)转换为通用NFA(非确定性有限自动机),将此有限自动机转换为正则表达式。应该怎么做? NFA和DFA的状态图是否相同?
答案 0 :(得分:0)
因此,图片中有两个DFA,因此我将展示如何依次获取每个DFA的RE。首先,我们写下一些方程式:
(q1) = (q1)a + (q2)b + e
(q2) = (q1)b + (q2)a
现在我们可以在每个规则上使用规则(q) = (q)x + y <=> (q) = yx*
(q1) = ((q2)b + e)a*
(q2) = (q1)ba*
现在我们可以替代了,因为我们关心(q2),所以我们还是可以直接得到它:
(q2) = ((q2)b + e)a*ba*
= (q2)ba*ba* + a*ba*
= a*ba*(ba*ba*)*
我们得到的正则表达式a*ba*(ba*ba*)*
一眼看上去是正确的。我们如何得到方程式?对于每个州,我们写下了“进入”该州的方式,并将其与+(或并集)组合在一起。我们将空字符串e包含在(q1)的方程式中,因为(q1)是初始状态,不需要消耗任何东西(初始)。
第二,等式如下:
(q1) = (q3)a + e
(q2) = (q1)(a + b) + (q2)a + (q3)b
(q3) = (q2)b
我们可以使用规则消除(q2)的自引用:
(q1) = (q3)a + e
(q2) = ((q1)(a + b) + (q3)b)a*
(q3) = (q2)b
现在,我们替换并再次使用该规则:
(q1) = (q3)a + e
(q2) = ((q1)(a + b) + (q3)b)a*
(q3) = ((q1)(a + b) + (q3)b)a*b
= (q1)(a + b)a*b + (q3)ba*b
= (q1)(a + b)a*b(ba*b)*
现在,我们再次替换并再次使用该规则:
(q1) = (q1)(a + b)a*b(ba*b)*a + e
= e((a + b)a*b(ba*b)*a)*
= ((a + b)a*b(ba*b)*a)*
(q2) = ((q1)(a + b) + (q3)b)a*
(q3) = (q1)(a + b)a*b(ba*b)*
我们现在可以代入以获取(q3)的表达式:
(q1) = ((a + b)a*b(ba*b)*a)*
(q2) = ((q1)(a + b) + (q3)b)a*
(q3) = ((a + b)a*b(ba*b)*a)*(a + b)a*b(ba*b)*
正则表达式将是(q1)和(q3)表达式的并集,因为它们是接受状态:
r = ((a + b)a*b(ba*b)*a)* + ((a + b)a*b(ba*b)*a)*(a + b)a*b(ba*b)*
= ((a + b)a*b(ba*b)*a)*(e + (a + b)a*b(ba*b)*)
第一部分以各种可能的方式将您从状态q1带回到状态q1。第二部分说您可以留在q1或做其他事情,否则将导致q3。
答案 1 :(得分:0)
维基百科参考了本课程的PDF:Second Part of Regular Expressions Equivalence with Finite Automata,并且根据本文档,该过程从此初始步骤开始:
通过以下过程将DFA转换为特殊形式的GNFA:
- 从所有旧接受状态开始,将带有\ epsilon箭头的新开始状态添加到旧的开始状态,并使用\ epsilon箭头添加新的接受状态。
(重点是我的)
因此,NFA和DFA将不相同。这也说明了如何处理多个接受状态。
答案 2 :(得分:-1)
否,在转换过程中NFA和DFA的状态图将不相同。
第二个FSM正则表达式为- εU(aUb)a b(bUa(aUb)a b)*(εUa)
您可以参考以下步骤-
这是一个例子- 这些是Michael Sipser的PDF版本的书中的屏幕截图-“计算理论简介”。