【发布时间】:2019-03-28 17:49:37
【问题描述】:
我需要通过将 DFA(确定性有限自动机)转换为通用 NFA(非确定性有限自动机)来将此有限自动机转换为正则表达式。应该怎么做? NFA 和 DFA 的状态图是否相同?
【问题讨论】:
标签: regex computer-science automata computation-theory
我需要通过将 DFA(确定性有限自动机)转换为通用 NFA(非确定性有限自动机)来将此有限自动机转换为正则表达式。应该怎么做? NFA 和 DFA 的状态图是否相同?
【问题讨论】:
标签: regex computer-science automata computation-theory
所以图中有两个 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。
【讨论】:
维基百科参考本课程 PDF:Second Part of Regular Expressions Equivalence with Finite Automata,根据本文档,程序从这个初始步骤开始:
通过以下过程将 DFA 转换为特殊形式的 GNFA:
- 在旧的开始状态中添加一个带有 \epsilon 箭头的新开始状态,并从所有旧的接受状态中添加一个带有 \epsilon 箭头的新接受状态。
(强调我的)
因此 NFA 和 DFA 将不相同。这也解释了如何处理多个接受状态。
【讨论】:
NO NFA 和 DFA 的状态图在转换过程中不会相同。
对于第二个 FSM 正则表达式将是 - ε U (aUb) ab (bUa(aUb)ab)* (εUa)
你可以参考这些步骤——
这是一个例子 - 这些是本书 PDF 版本的屏幕截图 - Michael Sipser 的“计算理论导论”。
【讨论】: