【问题标题】:What is the regex equivalent of this finite automaton?这个有限自动机的正则表达式等价物是什么?
【发布时间】:2014-09-25 16:22:07
【问题描述】:

我从未研究过 fa 以重新转换两个最终状态。

我该怎么办?

我应该摆脱另一个最终状态吗?

我摆脱了q3,我得到了

(a*b(aa)*bb*ab)*

或者我应该交替和kleene star q1 到 q3 和 q1 到 q3 到 q1?

如果我这样做,我会得到

(a*b(aa)*bb* + a*b(aa)*bb*ab)* 

这有点接近,因为alternate 的左侧可以在q3 结束,而其他在q1 结束。但是话又说回来,即使 fa 显然可以,该正则表达式仍然存在不接受简单 'a' 的问题。

【问题讨论】:

  • 如果要将其转换为正则表达式,则需要先将其转换为DFA。添加状态q4 和从q1q4 和从q3q4 的epsilon 路径。然后将其转换为 DFA。如果只有一种接受状态,事情应该会更容易。
  • 如果您仍然无法解决,我想在我回家后向您展示我的步骤。 :)
  • @HuStmpHrr:将 NFA 转换为 DFA 可能(通常会)将单个接受状态拆分为多个接受状态。在上面的示例中,您最终会得到相同的两个接受状态...
  • 我将非常感激。 :) 我错过了很多课程(3 周),而自动机和语言理论并不是我现在正在学习的唯一高 cmsc 课程
  • @HuStmpHrrr 那是我的下一个问题,不会添加另一个状态并将其转换为 DFA 只会添加更多最终/接受状态,因此会更困难吗?或者与 NFA 到 RE 相比,还有另一种将 DFA 转换为 RE 的方法吗?

标签: regex regular-language finite-automata


【解决方案1】:

要处理多个接受状态,请将您的 DFA 拆分为多个 DFA,每个 DFA 都与原始 DFA 相同,但只有一个接受状态(原始 DFA 中的每个接受状态对应一个 DFA)。现在(独立地)简化每个 DFA(组合相同的状态并消除无用的状态)并为每个 DFA 创建一个正则表达式。原始 DFA 的正则表达式将是所有这些正则表达式的合取(与 | 组合)。

因此,在您的情况下,您将有两个 DFA,一个只有 q0 作为接受,一个只有 q3。在其中的第一个中,q1 和 q3 是冗余的(相同的状态转换),因此您可以将 q3 组合到 q1 中(给您一个三态 DFA,其中 q1 在b 上循环)。正则表达式是:

(a | b(b|aa)*b)*

只有 q3 的 DFA 的正则表达式要复杂得多。先找到q3的路径:

a*b(aa|aba*b)*b

然后从 q3 追加循环:

(b | a(a|ba*b)(a(a|ba*b))*b)*

将所有这些放在一起:

(a|b(b|aa)*b)* | a*b(aa|aba*b)*b(b|a(a|ba*b)(a(a|ba*b))*b)*

不是一个简单的正则表达式

【讨论】:

  • 绝对不是,但感谢你做了那个长得可怕的正则表达式。我现在尝试转换它,看看它是否会出现相同的情况。再次感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多