如何找到两个NFA的交集

时间:2014-02-09 16:58:01

标签: algorithm intersection finite-automata dfa nfa

在DFA中,我们可以通过执行两个自动机状态的交叉积并接受在初始自动机中接受的那些状态来完成两个自动机的交集。 联盟的表现同样如此。虽然我可以轻松地使用epsilon过渡在NFA中进行联合,但我如何进行交叉?

5 个答案:

答案 0 :(得分:5)

您可以像在DFA一样使用NFA上的跨产品构造。唯一的变化是你如何处理ε-过渡。具体来说,对于交叉积自动机中的每个状态(q i ,r j ),可以添加从该状态到每对状态的ε-转换(q < sub> k ,r j )其中第一台机器中的ε-过渡从q i 到q k 并且到每对状态(q i ,r k ),其中第二台机器中的ε-转换从r j 到r ķ

或者,您始终可以将NFA转换为DFA,然后计算这些DFA的交叉乘积。

希望这有帮助!

答案 1 :(得分:2)

templatetypedef的回答有一个很大的错误。

L1和L2的产品自动机是NFA:

新状态Q = L1和L2状态的乘积。

现在转换功能

a是两个自动机字母表联合中的符号

delta((q_1,q_2),a)= delta_L1(q_1,a)X delta_L2(q_2,a)

这意味着您应该将delta_L1(q_1,a)的resactt与delta_L2(q_1,a)的结果相乘。

templatetypedef的答案中的问题是没有提到产品结果(qk,rk)。

答案 2 :(得分:0)

我们还可以使用De Morgan's Laws:交叉点B =(A&#39; U B&#39;)&#39;

将两个NFA的赞美联合起来相对简单,特别是如果你习惯了epsilon联合方法。

答案 3 :(得分:0)

Probabaly是一个迟到的答案,但由于今天我遇到了类似问题,我觉得要分享它。首先要实现交集的意义。在这里,这意味着给定字符串 e e 应该被两个自动机接受。

考虑下面的自动机:

  1. m1 接受语言{w | w包含'11'作为子字符串}
  2. m2 接受语言{w | w包含'00'作为子字符串}
  3. Intiuitivly m = m1 m2 是接受包含'11'和'00'作为子串的字符串的自动机。我们的想法是同时模拟两个自动机。

    现在让我们正式定义交集。

    m =(Q,Σ,Δ,q0,F)

    • 让我们首先定义 m 的状态,如上所述, m1 m2 。因此,如果我们将 a1 a2 作为 m1 b1 中状态的标签, b2 m2 中的状态,Q将包含以下状态: a1b1 a2b1 a1b2 a2b2 。这背后的意义是跟踪 m1 m2 的位置。

    • Σ很可能保持不变,但在某些情况下它们有所不同,我们只是在 m1 m2 中使用字母表联合。

    • q0现在是Q中的状态,包含 m1 的开始状态和 m2 的开始状态。 ( a1b1 ,举个例子。)

    • F包含状态 s IF,并且只有在 s 中提到的两个状态都是 m1 m2的接受状态分别。

    • 最后,但并非最不重要的Δ;我们再次根据carthesian乘积定义delta,如下:Δ( a1b1 ,E)=Δ( m1 )( a1 ,E )xΔ( m2 )( b1 ,E)如果我没有弄错的话,也会在上面的一个答案中加入。这背后的直观想法是将 a1b1 拆开,并在其原始自动机中考虑状态 a1 b1 。现在我们“迭代”每个可能的边缘,让我们选择E,例如,看看它在原始自动机中的位置。之后,我们使用carthesian产品将这些结果粘合在一起。如果 m1 中存在( a1 ,E),而 m2 中不存在Δ( b1 ,E) m 中不存在edge,否则我们会有某种联合构造。

答案 4 :(得分:-1)

构建产品自动机的另一种方法是允许更复杂的验收标准。通常,NFA在达到一组接受最终状态中的任何一个时接受输入字符串。这可以扩展到布尔状态组合。具体来说,你就像为联合一样构造交集的自动机,但是考虑结果自动机只有当它在两个自动机中接受最终状态(相当于)时才接受输入字符串。