我获得了2个DFA。 *表示最终状态和 - >表示在字母{a,b}上定义的初始状态。
1) - > A带a转到A. - > A与b前往* B. * B带a到* B. * B与b前往 - > A。
这个的正则表达式显然是: E = a * b(a * +(a * ba * ba *)*)
它接受的语言是L1 = {w over {a,b} | w是b之后是任意数量的a后跟任意数量的a或w是b之前是任意数量的a后跟任意数量的bb,其中任意数量的a在(bb的中间),结束或开始的中间。}
2) - > * A与b进入 - > * A. - > * A与a进入* B.带有b的 B进入 - > A. * B带有a转到C. C带有a转到C. C带b转到C.
注意:A是最终状态和初始状态。 B是最终状态。
现在我得到的正则表达式是:
E = b *((ab)* + a(b b * a)*)
最后,这个DFA接受的语言是: L2 = {w over {a,b} | w是n 1,后跟k 01或a后跟m 11 ^ r0,其中n,km,r> = 0}
现在的问题是,是否有一种更清晰的方式来表示语言L1和L2,因为它看起来确实很难看。提前谢谢。
答案 0 :(得分:0)
E = a* b(a* + (a* ba* ba*)*)
= a*ba* + a*b(a* ba* ba*)*
= a*ba* + a*b(a*ba*ba*)*a*
= a*b(a*ba*ba*)*a*
= a*b(a*ba*b)*a*
这是包含奇数a
个的b
和b
的所有字符串的语言。这可能最符合地用符号表示为{w in {a,b}* | #b(w) = 1 (mod 2)}
。
对于第二个:进入州B的唯一方法是在a
中看到A
,以及从外部C
到C
的唯一方法是a
中的B
。 C
处于死亡状态,唯一的方法是aa
从A
开始。那就是:如果你连续看到两个a
,那么字符串就不在语言中;该语言是a
和b
上不包含子字符串aa
的所有字符串的集合。这可能最简洁地用符号表示为{(a+b)*aa(a+b)*}^c
,其中^c
表示“补充”。