从 dfa 转换为正则表达式

问题描述 投票:0回答:1

有人可以向我解释一下如何将此 DFA 转换为正则表达式吗?

我尝试过使用 Arden 定理,但我不知道如何简化方程以获得此 DFA 的正则表达式。如果有人可以告诉我如何简化表达式,那将是一个很大的帮助。

regex dfa
1个回答
1
投票

首先,让我们将各州命名为𝑞𝑎...𝑞𝑓,如下所示:

这些状态代表从起始状态𝑞𝑎开始时导致该状态的表达式,因此我们寻找的解决方案是𝑞end = 𝑞𝑑 + 𝑞𝑓

然后根据其他状态创建每个状态的方程:

      𝑞𝑎 = ε
𝑞𝑏 = (𝑞𝑎 + 𝑞𝑐)1
𝑞𝑐 = 𝑞𝑏2
𝑞𝑑 = (𝑞𝑎 + 𝑞𝑐 + 𝑞𝑑)(3 + 4)
𝑞𝑒 = (𝑞𝑑 + 𝑞𝑓)5
𝑞𝑓 = 𝑞𝑒(6 + 7)
𝑞结束 = 𝑞𝑑 + 𝑞𝑓

我们可以替换 𝑞𝑎、𝑞𝑐 和 𝑞𝑓:

      𝑞𝑏 = (ε + 𝑞𝑏2)1 = 1 + 𝑞𝑏21
𝑞𝑑 = (ε + 𝑞𝑏2 + 𝑞𝑑)(3 + 4) = (ε + 𝑞𝑏2)(3 + 4) + 𝑞 𝑑(3 + 4)
𝑞𝑓 = (𝑞𝑑 + 𝑞𝑓)5(6 + 7) = 𝑞𝑑5(6 + 7) + 𝑞𝑓 5( 6 + 7)
𝑞结束 = 𝑞𝑑 + 𝑞𝑓

我们可以将雅顿定理应用于其中的每一个:

      𝑞𝑏 = 1(21)*
𝑞𝑑 = (ε + 𝑞𝑏2)(3 + 4)(3 + 4)*
𝑞𝑓 = (𝑞𝑑56 + 𝑞𝑑57)(5(6 + 7))*
𝑞结束 = 𝑞𝑑 + 𝑞𝑓

我们可以替代𝑞𝑏:

      𝑞𝑑 = (ε + 1(21)*2)(3 + 4)(3 + 4)* = (12)*(3 + 4)(3 + 4)*
𝑞𝑓 = 𝑞𝑑5(6 + 7)(5(6 + 7))*
𝑞结束 = 𝑞𝑑 + 𝑞𝑓

和𝑞𝑑和𝑞𝑓

      𝑞𝑑 = (12)*(3 + 4)(3 + 4)*
𝑞𝑓 = (12)*(3 + 4)(3 + 4)*5(6 + 7)(5(6 + 7))*

解决方案:

      𝑞结束 = (12)*(3 + 4)(3 + 4)*(ε + 5(6 + 7)(5(6 + 7))*)
= (12)*(3 + 4)(3 + 4)*(5(6 + 7))*


注意:如果我们将其写为编程中使用的正则表达式,那么 𝑞end 可以写为:

^(12)*[34]+(5[67])*$
© www.soinside.com 2019 - 2024. All rights reserved.