【发布时间】:2012-05-27 08:53:05
【问题描述】:
我正在尝试解决一个问题,我必须为两种语言的联合创建一个 DFA。
这些是: {s 是 {a, b, c}*| s 中的每个“a”都紧跟一个“b”} 和
{ s 是 {a, b, c}*| s 中的每个 "c" 前面都紧跟着一个 "b"}
我认为我在正确的轨道上,但不确定它是否完全正确。有人可以看看吗?
【问题讨论】:
标签: computer-science finite-automata
我正在尝试解决一个问题,我必须为两种语言的联合创建一个 DFA。
这些是: {s 是 {a, b, c}*| s 中的每个“a”都紧跟一个“b”} 和
{ s 是 {a, b, c}*| s 中的每个 "c" 前面都紧跟着一个 "b"}
我认为我在正确的轨道上,但不确定它是否完全正确。有人可以看看吗?
【问题讨论】:
标签: computer-science finite-automata
这是一个类似的post,它解释了如何找到两个 DFA 的并集。
理解的关键是你必须同时运行两个 DFA,或者一般来说你必须在联合 DFA 中维护两个 DFA 的状态。
编辑:
您得到错误结果的原因是,您的 DFA 不是确定性的,而且它们实际上并不能决定您描述的语言。我认为您对 Union 的计算是正确的,但您应该在继续之前修复您的 DFA。
【讨论】:
2 并获得 c 作为输入怎么办?
c-transition 从状态2 到某个其他状态,以确保第二个DFA 是确定性的。您将转换指向哪个状态取决于您期望从 DFA 中获得的预期行为。
两种语言的交集由L1 ∩ L2 = not(not(L1) ∪ not(L2)) 给出(根据德摩根定律)。
DFA 的补码 ("not") 是通过将所有接受状态更改为不接受来给出的,反之亦然。这将为您提供一个非确定性有限自动机 (NFA)。
联合是通过将您的两个 DFA 或 NFA 组合成一个同时接受两种语言的新 NFA 来创建的。这是通过引入一个启动状态来完成的,您可以从该状态进入两个 NFA 的启动状态,而无需消耗任何东西(仅消耗 ε)。
当您完成所有这些操作后,您就获得了 NFA。您可以使用常用方法将其简化为 DFA。
【讨论】:
c 时,DFA 将不知道该怎么做。