如何通过NFA将自动机转换为正则表达式

时间:2019-03-28 17:49:38

标签: regex computer-science automata computation-theory

我需要通过将DFA(确定性有限自动机)转换为通用NFA(非确定性有限自动机),将此有限自动机转换为正则表达式。应该怎么做? NFA和DFA的状态图是否相同?

DFA Picture

3 个答案:

答案 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:

     
      
  1. 所有旧接受状态开始,将带有\ epsilon箭头的新开始状态添加到旧的开始状态,并使用\ epsilon箭头添加新的接受状态。
  2.   

(重点是我的)

因此,NFA和DFA将相同。这也说明了如何处理多个接受状态。

答案 2 :(得分:-1)

否,在转换过程中NFA和DFA的状态图将不相同。

第二个FSM正则表达式为-     εU(aUb)a b(bUa(aUb)a b)*(εUa)

您可以参考以下步骤-

这是一个例子- 这些是Michael Sipser的PDF版本的书中的屏幕截图-“计算理论简介”。