如何找到两个 NFA 的交集

Posted

技术标签:

【中文标题】如何找到两个 NFA 的交集【英文标题】:How to find the intersection of two NFA 【发布时间】:2014-03-06 21:20:17 【问题描述】:

在 DFA 中,我们可以通过对两个自动机的状态进行叉积并接受在两个初始自动机中都接受的那些状态来计算两个自动机的交集。 类似地执行联合。尽管我可以使用 epsilon 转换轻松地在 NFA 中进行联合,但我该如何进行它们的交集?

【问题讨论】:

【参考方案1】:

您可以像使用 DFA 一样在 NFA 上使用叉积构造。唯一的变化是你如何处理 ε-transitions。具体来说,对于叉积自动机中的每个状态 (qi, rj),您可以从该状态向每对状态 (qk, rj) 其中第一台机器中存在 ε 转换,从 qi 到 qk 再到每对状态 (qi, rk) 在第二台机器中存在从 rj 到 r 的 ε 转换k.

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

希望这会有所帮助!

【讨论】:

所以没有像在 union case 中添加 epsilon 这样简单的方法吗? @AdityaNambiar- 据我所知不是。 这里的另一个答案提出了对丢失“同时 ε-transitions”的担忧,即两台机器同时进行 ε-transitions。我还没有发现省略它们有任何问题,因为这些转换无论如何都可以通过几个步骤完成,但也许有一些奇怪的边缘情况。你能澄清一下吗? @harold 我不认为你需要明确处理这种情况,因为你可以想象在第一台机器中跟随一个 ε-transition 然后在第二台机器上进行一个 ε-transition 作为即使上面的构造不直接包括从初始对到目标对的转换,也是一串两个ε。 @AdityaNambiar 如果你想要一些简单的方法,比如联合案例的方法,你需要交替自动机而不是非确定性自动机。它还将允许您有效地执行语言补充(以及所有有用的布尔运算,例如包含)。问题再次在于 AFA 的更难模拟和分析。【参考方案2】:

我们也可以使用De Morgan's Laws:A 交叉点 B = (A' U B')'

将两个 NFA 的赞美并集比较简单,特别是如果您习惯了 epsilon 的并集方法。

【讨论】:

嗯...除了先将 NFA 变成 DFA 之外,您如何接受 NFA 的否定? 虽然这个答案是正确的,但补码确实需要转换为具有幂集构造的 DFA——即使对于所有三个补码,因为 epsilon 方法会创建另一个 NFA。至少指数最坏情况。 (可能是2^2^n,但我不确定这种情况是否真的存在。)【参考方案3】:

templatetypedef 的回答有很大的错误。

作为 NFA 的 L1 和 L2 的积自动机:

新状态 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) 的结果集与 delta_L2(q_1 , a) 的结果集相乘。

templatetypedef 的答案中的问题是未提及产品结果 (qk ,rk)。

【讨论】:

请注意,harold 和 templatetypedef 已经在 templatetypedef 的回答下的线程中解决了这个问题,这似乎不是问题。【参考方案4】:

可能是一个迟到的答案,但由于我今天遇到了类似的问题,所以我想分享它。先搞清楚交点的意思。在这里,这意味着给定字符串 ee 应该被两个自动机接受。

考虑以下自动机:

    m1 接受语言 w | w 包含 '11' 作为子字符串 m2 接受语言 w | w 包含 '00' 作为子字符串

Intiuitivly m = m1m2 是接受包含 '11' 和 '00' 作为子字符串的字符串的自动机。这个想法是同时模拟两个自动机。

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

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

让我们从定义 m 的状态开始,正如上面提到的,m1m2 中的状态的 carthesian 积>。因此,如果我们将 a1a2 作为 m1 中状态的标签,而 b1 b2 m2 中的状态,Q 将由以下状态组成:a1b1a2b1a1b2a2b2。这背后的含义是跟踪 m1m2 中的位置。

Σ 很可能保持不变,但在某些情况下它们会有所不同,我们只需将 m1m2 中的字母并集。

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

F 包含状态 s IF 且仅当 s 中提到的两个状态都是 m1m2 的接受状态 分别。

最后,但并非最不重要的 Δ;我们再次根据 carthesian 积定义 delta,如下: Δ(a1b1, E) = Δ(m1)(a1, E ) x Δ(m2)(b1, E) 如果我没记错的话,也会在上述答案之一中提到。这背后的直观想法是将 a1b1 分开,并考虑其原始自动机中的状态 a1b1。现在我们“迭代”每个可能的边,例如选择 E,看看它在原始自动机中将我们带到哪里。之后,我们使用 carthesian 积将这些结果粘合在一起。如果 (a1, E) 存在于 m1 中,但不存在 Δ(b1, E) 在 m2m 中不存在边,否则我们会有某种联合构造。

【讨论】:

【参考方案5】:

构建产品自动机的替代方法是允许更复杂的验收标准。通常,当 NFA 达到一组接受最终状态中的任何一个时,它就会接受输入字符串。这可以扩展到状态的布尔组合。具体来说,您可以像为并集一样为交集构造自动机,但考虑生成的自动机仅在两个自动机中都处于(对应于)接受最终状态时才接受输入字符串。

【讨论】:

以上是关于如何找到两个 NFA 的交集的主要内容,如果未能解决你的问题,请参考以下文章

如何找到两个数组列的交集

如何在MATLAB中找到两个函数的交集?

如何找到两个 Django 查询集的交集?

Java,找到两个数组的交集

两个已排序List求交集

java找到两个list的交集并集差集