有限自动机需要正则表达式:偶数个 1 和偶数个 0

Posted

技术标签:

【中文标题】有限自动机需要正则表达式:偶数个 1 和偶数个 0【英文标题】:Need Regular Expression for Finite Automata: Even number of 1s and Even number of 0s 【发布时间】:2013-06-29 12:15:01 【问题描述】:

我的问题对你来说可能听起来不一样。

我是初学者,我正在学习有限自动机。我正在互联网上搜索 下面给定机器有限自动机的正则表达式。

谁能帮我写一下上面机器的“有限自动机的正则表达式”

任何帮助将不胜感激

【问题讨论】:

试试雅顿的 Therm。这个答案可能对您有所帮助:How to write regular expression for a DFA @GrijeshChauhan。感谢您的链接。因为我是新手,很难理解。 :( 我只为新手精心编写 :) 尝试使用 Arden 的 Therm。实际上为您的 DFA 编写 RE 直接 有点典型。 (即使使用 Arden 的热解决方案也会很长) 感谢您的宝贵支持。我已经尝试了很多,我只看到了你的帖子。但是因为我无法解决这个问题,所以我在这里发帖。仍在等待解决方案:( 【参考方案1】:

如何使用 Arden 定理为 DFA 编写正则表达式

我们用Σ = a, b代替语言符号0,1,下面是新的DFA。

注意开始状态是Q0

你还没有给出,但在我的回答中,初始状态是 Q0,最终状态也是 Q0

DFA 接受的语言是由符号 ab 组成的所有字符串的集合,其中符号的数量 ab 是偶数(包括Λ)。

一些示例字符串是Λ, aa, bb, abba, babbab ,没有符号出现的顺序和模式的限制,只是两者都应该是偶数次。 注意:Λ 是允许的,因为 numberOf(a) 和 numberOf(b) 为零,即偶数。

正如我在直线回答中所说:How to write regular expression for a DFA 每个州都存储一些信息。以下是上述 DFA 中每个状态存储的信息。

Q0:偶数a和偶数b Q1a的奇数和b的偶数 Q2:奇数a和奇数b Q3:偶数个a和奇数个b

您可以通过更改最终状态集来为更有趣的语言制作 DFA应该阅读划线的答案,因为我在两个答案中都为 DFA 罚款 RE 的方法不一样

什么是正则表达式? 该方法在下面使用Arden's Theorem 进行解释,适用于转换图,其中有一个单一的开始状态并且没有定义空移动(我们的 DFA 就是这种形式)。该技术在一本书中进行了解释:Formal Languages And Automata Theory

记住4.2 ARDEN THEOREM:

BCΣ 上的两个正则表达式。如果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)

如上所述,我们可以根据状态 Q0a, 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 解决方案以符号 ab 的形式找到状态 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.Q​​3 = Q0(b(aa)* + a(bb)* ba(aa)* )(ab(bb)* ba (aa)* )*

现在,我们有方程-(1)、(7)、(8):

1. Q0 = Λ + Q1a + Q3b7. 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 + Q3b7. 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)*

【讨论】:

有关所使用算法的实现,请参阅我对github.com/whekman/red-dragon-book/blob/master/ch3/3_7.md中的相关问题的回答【参考方案2】:

设E是a偶数个b的语言,下面是E语言的正则表达式

[00 + 11 + (01+10)(11+00)(01+10)]

00 = type1

11 = 类型 2

(01+10)(00+11)*(01+10) = type3

假设我们从左开始沿着 E 语言中的一个单词扫描 一次正确阅读两个字母。首先我们来一个双0(type1), 然后到 double 1 (type2) ,然后到另一个 double 0 (再次输入 1)。然后也许我们遇到了一对不一样的字母。例如,假设接下来的两个字母是 10。这必须以 type3 的子字符串开头。它以一个未加倍的对(01 或 10)开始,然后是一段加倍的字母(00 或 11 的多次重复),最后以另一个未加倍的对(又是 01 或 10)结束。这部分单词的一个特性是它有偶数个 0 和偶数个 1。如果该部分以 10 开头,则它可以以 01 结尾,但在结尾处仍然给出两个 0 和两个 1,其间只有两个字母。如果开始了 以 10 结尾并以 01 结尾,同样,它会给出偶数个 0 和偶数个 1。在 type3 的这一部分之后,我们可以继续 有更多类型的部分,或者 type2 直到我们遇到另一个 undoubled 对,开始另一个 type3 部分。我们知道另一对不会翻倍 来平衡最初的。总的效果是每个字 E的语言包含偶数个0和偶数个 1 个

【讨论】:

【参考方案3】:

这是偶数语言的 DFA 包含偶数个 0 和 1

它的 RE 是这样的

(00 + 11 + (01+10)(01+10) (00 + 11)*)*

这里,它会接受 0 和 1 的偶数的 lemda

或将接受 (00) 偶数 nmbr 为 0 并且没有 1 表示此处的 nmber of 1 是偶数。或者 (11) 在这种情况下 (0) 的 nmber 是偶数 .. 所以您可以检查它是否会生成包含偶数个 0 和 1 的字符串 ..

希望它能解决你的问题

【讨论】:

以上是关于有限自动机需要正则表达式:偶数个 1 和偶数个 0的主要内容,如果未能解决你的问题,请参考以下文章

可以告诉我给定语言的正则表达式吗?

.NET正则表达式基础入门

如何用c语言编写可判断奇数偶数的小程序?

1313:例3.5位数问题

正则表达式入门字符组

c语言实践输出某个区间中不是3的倍数的偶数