有限自动机需要正则表达式:偶数个 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 接受的语言是由符号 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 + 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的主要内容,如果未能解决你的问题,请参考以下文章