我的问题对你来说可能听起来不同。
我是初学者,我正在学习有限自动机。我正在互联网上查找下面给定机器的有限自动机的正则表达式。
谁能帮我写上面机器的“有限自动机的正则表达式”
任何帮助将不胜感激
我的问题对你来说可能听起来不同。
我是初学者,我正在学习有限自动机。我正在互联网上查找下面给定机器的有限自动机的正则表达式。
谁能帮我写上面机器的“有限自动机的正则表达式”
任何帮助将不胜感激
让我们代替语言符号0
,1
我们采用Σ = {a, b}
新的 DFA。
注意开始状态为 Q 0
你没有给出,但在我的回答中,初始状态是 Q 0,最终状态也是 Q 0。
is DFA 接受的语言是由所有字符串组成的集合,由符号a
和符号数组成,b
其中符号数为偶数(包括)。a
b
Λ
一些示例字符串是{Λ, aa, bb, abba, babbab }
,没有符号出现的顺序和模式的限制,只是两者都应该是偶数次。
注意:Λ
是允许的,因为 numberOf( a
) 和 numberOf( b
) 为零即偶数。
正如我在我的直线回答中所说:如何为 DFA 编写正则表达式,每个州都存储一些信息。下面是上面 DFA 中每个状态存储的信息。
Q 0:偶数
a
和偶数 Q 1:奇数 和偶数 Q 2:奇数 和奇数 Q 3:偶数 和奇数b
a
b
a
b
a
b
(您可以通过更改最终状态集为更有趣的语言制作 DFA)
人们应该阅读划线的答案,因为我在两个答案中对 DFA 罚款 RE 的方法是不同的
什么是正则表达式?
下面使用Arden 定理解释该方法,适用于有单个开始状态且未定义空移动的转换图(我们的 DFA 就是这种形式)。该技术在一本书中进行了解释:形式语言和自动机理论
记住4.2 雅顿定理:
Let
B
和C
be 是两个正则表达式Σ
。如果C
不包含Λ
,则方程 A = B + AC 有唯一的(一个且只有一个)解 A = BC*。
[解决方案]:
Step-1:写出初始方程,一个方程对应于DFA中的每个状态。这个等式意味着如何一步达到一个状态
因此,根据我们的 DFA,以下 4 个方程是可能的:
- Q 0 =
Λ
+ Q 1 a + Q 3 b- Q 1 = Q 0 a + Q 2 b
- Q 2 = Q 1 b + Q 3 a
- Q 3 = Q 0 b + Q 2 a
在等式(1)中,额外Λ
是因为Q 0是初始状态,无需任何输入(起点)即可到达。因为 Q 0也只是一个最终状态,所以如果字符串a, b
以 Q 0结尾,那么它是可以接受的。Q 0的值将为我们提供所需的正则表达式,因此我们的目标是简单的方程-(1) a, b
。
步骤 2:通过将其他方程的状态值和使用 Arden 的简化方程来简化方程。
让我们首先取方程-(4) 并从方程-(3)中替换 Q 2的值。
Q 3 = Q 0 b + Q 2 a
Q 3 = Q 0 b + (Q 1 b + Q 3 a) a
Q 3 = Q 0 b + Q 1 ba + Q 3 aa
最后一个方程可以用 Arden 方程的形式来查看A = B + AC
。其中 A 是 Q 3,B = Q 0 b + Q 1 ba 和 C = aa
。所以根据 Arden 的 therm,方程 Q 3 = Q 0 b + Q 1 ba + Q 3 aa 有一个唯一解,即:
Q 3 = (Q 0 b + Q 1 ba)(aa)*
或者可以这样写:
5.
Q 3 = Q 0 b(aa)* + Q 1 ba(aa)*
从逻辑上讲,您可以检查/理解 eq-(5) 意味着可以通过两种方式到达Q 3+
( ) 首先通过应用b
Q 0aa
然后在 Q 3上有一个带有标签的循环,第二种方式是从 Q 1应用ba
。
以类似的方式,我们可以简化方程-(2)
Q 1 = Q 0 a + Q 2 b
Q 1 = Q 0 a + (Q 1 b + Q 3 a)b
Q 1 = Q 0 a + Q 1 bb + Q 3 ab
在这里使用 Arden 的简化规则。
Q 1 = (Q 0 a + Q 3 ab)(bb)*
进一步简化
6.
Q 1 = Q 0 a(bb)* + Q 3 ab(bb)*
现在 Q 3的值从方程-(5) 到方程-(6)
Q 1 = Q 0 a(bb)* + (Q 0 b(aa)* + Q 1 ba(aa)* )ab(bb)*
Q 1 = Q 0 a(bb)* + Q 0 b(aa) * ab(bb)* + Q 1 ba(aa)* ab(bb)*
再次使用 Arden 简化定律改进最后一个方程。
Q 1 = (Q 0 a(bb)* + Q 0 b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )*
以 Q 0骗子:
7.
Q 1 = Q 0 (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )*
你能理解这个方程,它是如何从状态 Q 0到 Q 1的吗?我们将此解记为等式-(7)
如上所述,我们可以根据状态 Q 0和来评估 Q 1的值,同样我们要评估状态 Q 3的值。为此,我们可以简单地将方程-(5) 中的状态 Q 1 的值放入方程-(7)。 a, b
5.
Q 3 = Q 0 b(aa)* + Q 1 ba(aa)*
.
Q 3 = Q 0 b(aa)* + Q 0 (a(bb)* + b(aa)* ab(bb)* ) ( ba(aa)* ab(bb)* )* ba(aa)*
8.
Q 3 = Q 0 ( b(aa)* + (a(bb)* + b(aa)* ab(bb)* ) (ba( aa)* ab(bb)* )* ba(aa)* )
现在,在方程编号 (1) 中,从方程编号 (8) 和 (7) 接受 状态 Q 3和 Q 1的值。
Q 0 =
Λ
+ Q 1 a + Q 3 b
Q 0 =Λ
+ Q 0 (a(bb)* + (aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* a + Q 0 ( b(aa)* + (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* ba(aa)* ) b
现在,上次应用 Arden 解决方案以符号和的形式找到状态 Q 0的值。 a
b
Q 0 =
Λ
+ ( (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.
Q 3 = Q 0 b(aa)* + Q 1 ba(aa)*
6.
Q 1 = Q 0 a(bb)* + Q 3 ab(bb)*
两者结构对称,易于学习。(在上面的 eq-(5) 之后阅读我的评论)
为了根据 Q 0评估状态 Q 1的值,我将方程-(5) 中的 Q 3值放入方程-(6),得到方程-(7),如下所示:
7.
Q 1 = Q 0 (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )*
类似地,要根据 Q 0评估状态 Q 3的值,我们可以将方程-(6) 中的 Q 1值放入方程-(5),这将给出方程-(8) 的新形式,如下所示:
Q 3 = Q 0 b(aa)* + Q 1 ba(aa)*
Q 3 = Q 0 b(aa)* + (Q 0 a(bb)* + Q 3 ab(bb)* ) ba(aa) *
Q 3 = Q 0 b(aa)* + Q 0 a(bb)* ba(aa)* + Q 3 ab(bb)* ba(aa)*
现在,我们可以得到我们想要的形式的方程-(8):
8.
Q 3 = Q 0 (b(aa)* + a(bb)* ba(aa)* )(ab(bb)* ba(aa)* )*
现在,我们有等式-(1)、(7)、(8):
1.
Q 0 =Λ
+ Q 1 a + Q 3 b
7.
Q 1 = Q 0 (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )*
8.
Q 3 = Q 0 (b(aa)* + a(bb)* ba(aa)* ) (ab(bb)* ba(aa)* )*
现在,我们可以得到我们想要的形式的方程-(8):
8.
Q 3 = Q 0 (b(aa)* + a(bb)* ba(aa)* )(ab(bb)* ba(aa)* )*
现在,我们有等式-(1)、(7)、(8):
1.
Q 0 =Λ
+ Q 1 a + Q 3 b
7.
Q 1 = Q 0 (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )*
8.
Q 3 = Q 0 (b(aa)* + a(bb)* ba(aa)* ) (ab(bb)* ba(aa)* )*
现在将状态 Q 1和 Q 3的值代入方程-(1):
Q 0 =
Λ
+ Q 0 (a(bb)* + b(aa)* ab(bb)* ) (ba(aa)* ab(bb)* )* a + Q 0 (b(aa)* + a( bb)* ba(aa)* ) (ab(bb)* ba(aa)* )* b
也可以写成:
Q 0 =
Λ
+ Q 0 ( (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(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)*
设 E 是 a 和 b 的偶数个的语言,下面是语言 E 的正则表达式。
[00 + 11 + (01+10)(11+00) (01+10)]
00 = 类型 1
11 = 类型 2
(01+10)(00+11)*(01+10) = type3
假设我们正在扫描 E 语言中的一个单词,从左到右一次读取两个字母。首先是双 0(type1),然后是双 1(type2),然后是另一个双 0(再次输入 1)。然后也许我们遇到了一对不一样的字母。例如,假设接下来的两个字母是 10。这必须以 type3 的子字符串开头。它以一个未加倍的对(01 或 10)开始,然后是一段加倍的字母(00 或 11 的多次重复),最后以另一个未加倍的对(01 或 10 再次)结束。这部分单词的一个特性是它有偶数个 0 和偶数个 1。如果该部分以 10 开头,则它可以以 01 结尾,但在结尾处仍然给出两个 0 和两个 1,中间只有两个字母。如果它以 10 开头并以 01 结尾,同样,它将给出偶数个 0 和偶数个 1。在 type3 的这一部分之后,我们可以继续处理更多的 type 或 type2 部分,直到我们遇到另一个未加倍的对,开始另一个 type3 部分。我们知道另一对未加倍的对将出现以平衡最初的一对。总的效果是 E 语言的每个单词都包含偶数个 0 和偶数个 1
这是包含偶数个 0 和 1 的偶数语言的 DFA
它的 RE 将是这个
(00 + 11 + (01+10)(01+10) (00 + 11)*)*
在这里,它将接受甚至是 0 和 1 nmber 的 lemda
或将接受 (00) 甚至 0 的 nmbr 并且没有 1 表示此处 1 的 nmber 是偶数。或者 (11) 在这种情况下 (0) 的 nmber 是偶数 .. 所以您可以检查它是否会生成包含偶数的字符串数字 0 和 1 ..
希望它能解决你的问题