📜  状态消除法将 DFA/NFA/Ɛ-NFA 转换为正则表达式

📅  最后修改于: 2021-09-28 09:59:00             🧑  作者: Mango

状态消除方法:
将 DFA/NFA//Ɛ-NFA 转换为相应正则表达式的规则。

Arden 方法无法转换 Ɛ-NFA。通过状态消除方法,您可以方便快捷地找到RE,而无需凭想象写任何东西。

规则1 :
如果开始状态没有传入边,则继续检查其他规则。如果有到初始状态的传入转换,为了摆脱传入边缘,使用无传入边缘的新开始和带有Ɛ-transition 的传出边缘到旧的开始状态。之前的初始状态现在是正常状态,并添加了传入Ɛ-transition。

规则 2:
如果没有来自最终状态的传出边,则进一步检查最后一条规则。如果有来自最终状态的传出转换,为了摆脱传出边缘,制作没有传出边缘的新最终状态和来自Ɛ-转换的旧最终状态的传入边缘。随着 Ɛ 的附加转换,旧的最终状态转换为正常状态。

规则 3:
如果没有多个最终状态,则继续消除正常状态(最终和初始除外)。如果自动机有多个最终状态,建议剥离它们的最终状态状态,并将传出 Ɛ-transition 添加到新的且只有没有传出转换的最终状态。

消除正常状态:
我们以 DFA 为例,尝试通过 State Elimination 方法找到 RE。

以“a”结尾的 DFA

现在违反规则 1、2 来满足它们以分别使用传入 Ɛ-transition 和传出 Ɛ-transition 生成新的最终状态和新的初始状态。

以任何顺序消除状态 B 和 C,因为您希望在两种情况下答案都相同,现在让我们先消除 B。

消除 B 并想象如果不存在任何状态 B 那么我们直接从起始状态 A 到达状态 C,输入符号为 ‘Ɛb*a’ 我们可以忽略 Ɛ 那么输入符号将是来自 A 的 ‘b*a’到 C。

由于状态 B 不存在,从状态 C 到 B 的传出边缘现在成为自循环,比较去除 B 状态后的上下图像。边从 C 到 B,取 b* 并用 ‘a’ 返回 C,这可能发生无限时间,因此 b(b)*a 的自循环。我们可以将两个自循环 ‘a’ 和 ‘bb*a’ 作为 (bb*a +a) 表示我们可以一次遍历一个循环。 a 或 bb*a 作为结果 (bb*a + a) 是 C 状态 = (bb*a + a)* 上的闭包。

现在在消除 C 状态后,我们将直接从初始状态 A 到达最终状态 D,现在我们通过在 C 状态上输入 ‘b*a’ 到达状态 C,我们在 (bb*a + a) 上进行无限循环,并且Ɛ 到达最终状态 D。因此最终没有剩余的正常状态,我们直接得到了从初始到最终的输入符号流,即 b*a(bb*a + a)*。

如果您到达这里,感谢您阅读本文,此方法可帮助您快速找到 RE。它也将帮助 GATE-CSIT 有志者和 CS 本科生。如果你理解这个概念,试着为偶数 0 和奇数 1 找到 RE,这是一个非常棘手的问题,我也会发布一篇关于它的文章。如果发现任何错误,请 ping 我。