如何使用 Arden 定理为 DFA 编写正则表达式
我们用Σ = {a, b}代替语言符号0,1,下面是新的DFA。
注意开始状态是Q0
你还没有给出,但在我的回答中,初始状态是 Q0,最终状态也是 Q0。
DFA 接受的语言是由符号 a 和 b 组成的所有字符串的集合,其中符号的数量 a 和 b 是偶数(包括Λ)。
一些示例字符串是{Λ, aa, bb, abba, babbab },没有符号出现的顺序和模式的限制,只是两者都应该是偶数次。
注意:Λ 是允许的,因为 numberOf(a) 和 numberOf(b) 为零,即偶数。
正如我在直线回答中所说:How to write regular expression for a DFA 每个州都存储一些信息。以下是上述 DFA 中每个状态存储的信息。
Q0:偶数a和偶数b
Q1:a的奇数和b的偶数
Q2:奇数a和奇数b
Q3:偶数个a和奇数个b
(您可以通过更改最终状态集来为更有趣的语言制作 DFA)
应该阅读划线的答案,因为我在两个答案中都为 DFA 罚款 RE 的方法不一样
什么是正则表达式?
该方法在下面使用Arden's Theorem 进行解释,适用于转换图,其中有一个单一的开始状态并且没有定义空移动(我们的 DFA 就是这种形式)。该技术在一本书中进行了解释:Formal Languages And Automata Theory
记住4.2 ARDEN THEOREM:
让B 和C 是Σ 上的两个正则表达式。如果C 不包含Λ,那么对于方程A = B + AC 有一个唯一的(唯一一个)解A = BC*。
[解决方案]:
Step-1:写初始方程,一个方程对应DFA中的每个状态。这个等式表示如何一步达到一个状态
所以根据我们的 DFA,以下 4 个方程是可能的:
- Q0 =
Λ + Q1a + Q3b
- Q1 = Q0a + Q2b
- Q2 = Q1b + Q3a
- Q3 = Q0b + Q2a
在等式(1)中,额外的Λ 是因为Q0 是初始状态,无需任何输入(起点)即可到达。
因为 Q0 也只是一个最终状态,所以由 a, b 组成的字符串如果以 Q0 结尾是可以接受的。 Q0 的值将为我们提供所需的正则表达式,因此我们的目标是根据 a, b 来简化等式-(1)。
第 2 步: 使用来自其他方程的状态值并使用 Arden 的简化方程来简化方程。
让我们首先取方程-(4) 并从方程-(3) 中替换 Q2 的值。
Q3 = Q0b + Q2a
Q3 = Q0b + (Q1b + Q3a) a
Q3 = Q0b + Q1ba + Q3aa
最后一个方程可以用雅顿方程A = B + AC的形式来查看。其中 A 是 Q3,B = Q0b + Q1ba 和 C = aa。所以根据 Arden 的 therm,方程 Q3 = Q0b + Q1ba + Q3aa 有一个独特的解决方案是:
Q3 = (Q0b + Q1ba)(aa)*
或者可以这样写:
5.Q3 = Q0b(aa)* + Q1ba(aa)*
从逻辑上讲,您可以检查/理解 eq-(5) 意味着 Q3 可以通过在 Q0 上应用 b 以两种方式 (+) 获得sub> 然后在 Q3 上有一个带有标签 aa 的循环,第二种方法是从 Q1 应用 ba。
类似的方法,我们可以化简方程-(2)
Q1 = Q0a + Q2b
Q1 = Q0a + (Q1b + Q3a)b
Q1 = Q0a + Q1bb + Q3ab
在此处使用 Arden 的简化规则。
Q1 = (Q0a + Q3ab)(bb)*
进一步简化
6.Q1 = Q0a(bb)* + Q3ab(bb)*
现在 Q3 的值从方程-(5) 到方程-(6)
Q1 = Q0a(bb)* + (Q0b(aa)* + Q1ba(aa)* )ab(bb)*
Q1 = Q0a(bb)* + Q0b(aa)* ab(bb)* + Q1 ba(aa)* ab(bb)*
再次使用 Arden 简化定律改进最后一个方程。
Q1 = (Q0a(bb)* + Q0b(aa)* ab(bb)* ) ( ba(aa)* ab(bb)* )*
采取Q0骗子:
7.Q1 = Q0(a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab (bb)* )*
你能理解这个方程,它是如何从状态 Q0 到 Q1 的?我们将这个解记为方程-(7)
如上所述,我们可以根据状态 Q0 和 a, b 来评估 Q1 的值,同样我们要评估值对于状态 Q3。为此,我们可以简单地将方程-(5) 中的状态值 Q1 放入方程-(7)。
5.Q3 = Q0b(aa)* + Q1ba(aa)*
@987654367 @ Q3 = Q0b(aa)* + Q0(a(bb)* + b(aa)* ab(bb )* ) (ba(aa)* ab(bb)* )* ba(aa)*
8. Q3 = Q0 ( b(aa )* + (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* ba(aa)* )
现在,在方程编号 (1) 中,从方程编号 (8) 和 (7) 接受状态 Q3 和 Q1 的值。
Q0 = Λ + Q1a + Q3b
Q0 = Λ + Q0(a(bb)* + (aa)* ab(bb)* ) (ba(aa)* ab(bb) * )* a + Q0 ( b(aa)* + (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* ba(aa)* ) b
现在,上次应用 Arden 解决方案以符号 a 和 b 的形式找到状态 Q0 的值。
Q0 = Λ + ( (a(bb)* + (aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* a + ( b(aa)* + (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* ba(aa)* ) b )*
这与(我们可以在这里丢弃Λ)RE:
( (a(bb)* + (aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* a + ( b(aa)* + (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* ba(aa)* ) b )*
这就是您要寻找的 RE。
我不确定它是否可以进一步简化。我把它留给你作为练习。
在链接的问题中,我提出了一种非形式化的分析方法,但很难为这个 DFA 应用和找到 RE,这个问题展示了 Arden 定理的力量和逐步解决方案。
编辑:
我之前的正则表达式是正确的,但是因为不对称的形式很难葡萄。下面我正在写更对称的新形式的 RE。
我们有方程-(5)、(6)如下:
5. Q3 = Q0b(aa)* + Q1ba(aa)*
@987654376 @Q1 = Q0a(bb)* + Q3ab(bb)*
两者结构对称且易于学习。 (在上面的 eq-(5) 之后阅读我的评论)
为了根据 Q0 评估状态 Q1 的值,我将方程-(5) 中的 Q3 的值放入等式-(6) 给我等式-(7) 如下:
7. Q1 = Q0(a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab (bb)* )*
类似地,要根据 Q0 来评估状态 Q3 的值,我们可以将 Q1 的值从方程-( 6) 将方程-(5) 转化为方程-(8) 的新形式,如下所示:
Q3 = Q0b(aa)* + Q1ba(aa)*
Q3 = Q0b(aa)* + (Q0a(bb)* + Q3 ab(bb)* ) ba(aa)*
Q3 = Q0b(aa)* + Q0a(bb)* ba(aa)* + Q3 ab(bb)* ba(aa)*
现在,我们可以得到所需形式的方程-(8):
8.Q3 = Q0(b(aa)* + a(bb)* ba(aa)* )(ab(bb)* ba (aa)* )*
现在,我们有方程-(1)、(7)、(8):
1. Q0 = Λ + Q1a + Q3b
7. Q1 = Q0(a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )*
8. Q3 = Q0(b(aa)* + a(bb)* ba(aa)* ) (ab(bb)* ba(aa) * )*
现在,我们可以得到所需形式的方程-(8):
8.Q3 = Q0(b(aa)* + a(bb)* ba(aa)* )(ab(bb)* ba (aa)* )*
现在,我们有方程-(1)、(7)、(8):
1. Q0 = Λ + Q1a + Q3b
7. Q1 = Q0(a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )*
8. Q3 = Q0(b(aa)* + a(bb)* ba(aa)* ) (ab(bb)* ba(aa) * )*
现在将状态 Q1 和 Q3 的值代入方程-(1):
Q0 = Λ + Q0(a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* a + Q0(b(aa)* + a(bb)* ba(aa)* ) (ab(bb)* ba(aa)* )* b
也可以写成:
Q0 = Λ + Q0 ( (a(bb)* + b(aa)* ab(bb)* ) (ba(aa) * ab(bb)* )* a + (b(aa)* + a(bb)* ba(aa)* ) (ab(bb)* ba(aa)* )* b)
接下来,对这个方程应用Arden定理,我们得到最终的RE:
偶数个'a'和偶数个'b'的正则表达式:
( (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* a + (b(aa)* +
a(bb)* ba(aa)* ) (ab(bb)* ba(aa)* )* b )*
可以进一步简化如下:
((a + b(aa)*ab)(bb)*(ba(aa)*ab(bb)*)*a + (b + a(bb)*ba)(aa)*(ab(bb)*ba(aa)*)*b)*