📜  Epsilon-NFA 到 NFA 的转换

📅  最后修改于: 2021-09-28 09:33:51             🧑  作者: Mango

非确定性有限自动机 (NFA)是一种有限自动机,在给定输入符号上从给定状态移动 0 个、一个或多个。 Epsilon NFA 是包含 epsilon move(s)/Null move(s) 的 NFA。要从 epsilon-NFA 中删除 epsilon move/Null move 并将其转换为 NFA,我们按照下面提到的步骤操作。

图 –顶点 v1 和顶点 v2 有一个 epsilon 移动

第1步:
考虑具有 epsilon 移动的两个顶点。在图 1 中,我们有顶点 v1 和顶点 v2,epsilon 从 v1 移动到 v2。

第2步:
现在找到从顶点 v2 开始的任何其他顶点的所有移动(除了正在考虑的 epsilon 移动)。

找到移动后,复制从顶点 v2 开始的所有移动,使用相同的输入从顶点 v1 开始,并删除从顶点 v1 到顶点 v2 的 epsilon 移动。

第 3 步:
查看顶点 v1 是否为起始状态。如果顶点 v1 是开始状态,那么我们也将顶点 v2 作为开始状态。如果顶点 v1 不是开始状态,则不会有任何变化。

第四步:
查看顶点 v2 是否为最终状态。
如果顶点 v2 是最终状态,那么我们也将顶点 v1 作为最终状态。
如果顶点 v2 不是最终状态,则不会有任何变化。

重复这些步骤(从第 1 步到第 4 步),直到从 NFA 中删除所有 epsilon 移动。

现在,为了解释这种转换,让我们举一个例子。

示例:将 epsilon-NFA 转换为 NFA。
考虑具有状态 q0、q1、q2、q3 和 q4 的示例。

在上面的例子中,我们有 5 个状态,分别命名为 q0、q1、q2、q3 和 q4。最初,我们将 q0 作为起始状态,q2 作为最终状态。我们有 q1、q3 和 q4 作为中间状态。

上述NFA的转换表为:

States/Input Input 0 Input 1 Input epsilon
q0 q1 q2
q1 q0
q2 q3 q4
q3 q2
q4 q2

根据上面的转换表,

  • 获得输入 1 时的状态 q0 进入状态 q1。
  • 在作为空移动(即 epsilon 移动)获得输入时,状态 q0 进入状态 q2。
  • 获得输入 1 时的状态 q1 进入状态 q0。
  • 类似地,获得输入 0 时的状态 q2 进入状态 q3,获得输入 1 时的状态 q2 进入状态 q4。
  • 类似地,在获得输入 0 时状态 q3 进入状态 q2。
  • 类似地,在获得输入 0 时状态 q4 进入状态 q2。

我们可以看到我们有一个从状态 q0 到状态 q2 的 epsilon 移动,该状态将被删除。
为了消除从状态 q0 到状态 q1 的 epsilon 移动,我们将按照下面提到的步骤进行。

第1步:
考虑 epsilon 从状态 q0 移动到状态 q2。将状态 q0 视为顶点 v1,将状态 q2 视为顶点 v2。

图 – 将q0 状态为顶点 v1,将 q2 状态为顶点 v2

第2步:
现在找到所有从顶点 v2 (即状态 q2)开始的移动。

找到移动后,复制所有从顶点 v2 (即状态 q2)开始的具有相同输入的移动,以从顶点 v1 (即状态 q0)开始,并移除从顶点 v1 (即状态 q0)到顶点 v2的 epsilon 移动(即状态 q2)

由于在获得输入 0 时状态 q2 进入状态 q3。
因此,在复制移动时,我们将在获得输入 0 时状态 q0 也进入状态 q3。

类似地,在获得输入 1 时状态 q2 进入状态 q4。
因此,在复制移动时,我们将在获取输入 1 时状态 q0 也进入状态 q4。

所以,复制动作后的 NFA 是:

图 – NFA 关于重复动作

第 3 步:
由于顶点 v1 (即状态 q0)是一个开始状态。因此,我们还将使顶点 v2 (即状态 q2)作为起始状态。

请注意,状态 q2 也将保持为我们最初的最终状态。

使状态 q2 也作为开始状态后的 NFA 是:

图 –将状态 q2 作为起始状态后的 NFA

第四步:
由于顶点v2 (即状态q2)是最终状态。因此,我们还将使顶点 v1 (即状态 q0)作为最终状态。

请注意,状态 q0 也将保持为初始状态。

在使状态 q0 也作为最终状态之后,产生的 NFA 是:

图 –结果 NFA(状态 q0 作为最终状态)

上述结果 NFA 的转换表是:

States/Input Input 0 Input 1
q0 q3 q1,q4
q1 q0
q2 q3 q4
q3 q2
q4 q2