【问题标题】:The union of two determinstic finite automata?两个确定性有限自动机的并集?
【发布时间】: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


    【解决方案1】:

    这是一个类似的post,它解释了如何找到两个 DFA 的并集。

    理解的关键是你必须同时运行两个 DFA,或者一般来说你必须在联合 DFA 中维护两个 DFA 的状态。


    编辑:

    您得到错误结果的原因是,您的 DFA 不是确定性的,而且它们实际上并不能决定您描述的语言。我认为您对 Union 的计算是正确的,但您应该在继续之前修复您的 DFA。

    【讨论】:

    • 是的,这就是我所做的,但我只是想知道我的最终答案对您来说是否还可以,因为使用 dfa,您不需要为每个州的每个标签进行转换吗?
    • 您的第二个 DFA 是不确定的...如果您处于状态 2 并获得 c 作为输入怎么办?
    • 好的,我明白了,我可以让 c 从状态 2 转换到转储状态吗?
    • 您应该添加一个c-transition 从状态2 到某个其他状态,以确保第二个DFA 是确定性的。您将转换指向哪个状态取决于您期望从 DFA 中获得的预期行为。
    • 那么我可以创建一个新的非接受状态,并将 c 转换到它吗?
    【解决方案2】:

    两种语言的交集由L1 ∩ L2 = not(not(L1) ∪ not(L2)) 给出(根据德摩根定律)。

    DFA 的补码 ("not") 是通过将所有接受状态更改为不接受来给出的,反之亦然。这将为您提供一个非确定性有限自动机 (NFA)。

    联合是通过将您的两个 DFA 或 NFA 组合成一个同时接受两种语言的新 NFA 来创建的。这是通过引入一个启动状态来完成的,您可以从该状态进入两个 NFA 的启动状态,而无需消耗任何东西(仅消耗 ε)。

    当您完成所有这些操作后,您就获得了 NFA。您可以使用常用方法将其简化为 DFA。

    【讨论】:

    • 其实我觉得问题在于第二个DFA其实是一个NFA。如果处于状态 2,当输入 c 时,DFA 将不知道该怎么做。
    猜你喜欢
    • 2011-04-21
    • 2013-11-29
    • 2013-04-28
    • 2018-07-14
    • 2019-06-23
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多