【问题标题】:How to convert this automata to regular expression via NFA如何通过 NFA 将此自动机转换为正则表达式
【发布时间】:2019-03-28 17:49:37
【问题描述】:

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

【问题讨论】:

    标签: regex computer-science automata computation-theory


    【解决方案1】:

    所以图中有两个 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。

    【讨论】:

    • 谢谢,但我实际上需要使用通用 NFA (GNFA) 来构造正则表达式。我认为我需要使用的方法称为“状态消除”。我想我已经设法完成了第一个有限自动机,但我在第二个时遇到了麻烦。我目前有以下自动机,但我卡住了,我应该如何处理多个最终状态?这就是我所得到的(我使用 JFLAP 来绘制自动机)非常感谢您的帮助。 i.stack.imgur.com/It7GJ.png
    • @DanL 我怀疑您所指的本质上是这个,但只是叠加在有向图上。特别是,上述工作通过以特定方式表示状态和转换,然后一次消除一个状态。如果是这种情况,关于如何处理多个接受状态的答案可能只是在每个状态都有正则表达式后停止消除状态,然后进行联合。这相当于添加一个虚假的新接受状态和 lambda/spsilon 转换来强制一个接受状态,然后解决这个问题。
    【解决方案2】:

    维基百科参考本课程 PDF:Second Part of Regular Expressions Equivalence with Finite Automata,根据本文档,程序从这个初始步骤开始:

    通过以下过程将 DFA 转换为特殊形式的 GNFA:

    1. 在旧的开始状态中添加一个带有 \epsilon 箭头的新开始状态,并从所有旧的接受状态中添加一个带有 \epsilon 箭头的新接受状态。

    (强调我的)

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

    【讨论】:

      【解决方案3】:

      NO NFA 和 DFA 的状态图在转换过程中不会相同。

      对于第二个 FSM 正则表达式将是 - ε U (aUb) ab (bUa(aUb)ab)* (εUa)

      你可以参考这些步骤——

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

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-30
        • 2012-12-26
        • 2010-10-18
        • 1970-01-01
        相关资源
        最近更新 更多