非确定性有限自动机 (NFA)是一种有限自动机,在给定输入符号上从给定状态移动 0 个、一个或多个。 Epsilon NFA 是包含 epsilon move(s)/Null move(s) 的 NFA。要从 epsilon-NFA 中删除 epsilon move/Null move 并将其转换为 NFA,我们按照下面提到的步骤操作。
第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。
第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 是:
第 3 步:
由于顶点 v1 (即状态 q0)是一个开始状态。因此,我们还将使顶点 v2 (即状态 q2)作为起始状态。
请注意,状态 q2 也将保持为我们最初的最终状态。
使状态 q2 也作为开始状态后的 NFA 是:
第四步:
由于顶点v2 (即状态q2)是最终状态。因此,我们还将使顶点 v1 (即状态 q0)作为最终状态。
请注意,状态 q0 也将保持为初始状态。
在使状态 q0 也作为最终状态之后,产生的 NFA 是:
上述结果 NFA 的转换表是:
States/Input | Input 0 | Input 1 |
---|---|---|
q0 | q3 | q1,q4 |
q1 | – | q0 |
q2 | q3 | q4 |
q3 | q2 | – |
q4 | q2 | – |