语言C = {a,b}

时间:2018-10-28 19:12:44

标签: regular-language nsregularexpression automata dfa automata-theory

大家晚上好,我被下面的正则表达式困住了,

我认为比我的表达方法更简单

我必须写下正则表达式和dfa,即从字母{a,b}接受所有以b开头和结尾且具有偶数a的字符串。

我试图进入案件,但结果并不理想:

我尝试过这样的事情: b b * (aba)* (aab)* (aa)* (aab)* (aba)* b * b

但是我认为这还不完整。

我应该遵循一些一般规则来完成此任务吗?或者我只需要练习正则表达式?

谢谢,任何提示或帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

在这里制作DFA似乎更容易,所以我们可以从那里开始并从那里导出正则表达式。

我们将至少需要一个初始状态。此状态不能接受,因为空字符串不以b开头和结尾。我们将其称为q0

如果在此状态下看到a,则说明该字符串不是以b开头,因此无论接下来发生什么,我们都无法接受。我们可以用一个新的,失效的状态来表示。我们将其称为q1

如果我们在b中看到一个q0,则需要一个新状态来表示一个事实,即我们正在顺利地看到符合条件的字符串。实际上,字符串bb开头和结尾,并且具有偶数a(零是偶数);因此此状态必须是接受的。将此称为q2

如果我们在a中看到q2,则我们有奇数个a,并且最后一次没有看到b,因此我们不能接受该字符串。但是,仍然可以通过看到奇数个a后跟至少一个b来接受来自此状态的字符串。调用状态以表示此q3

如果我们在b中看到q2,则情况与以前一样(偶数a并最后看到了b,因此我们可以接受)。留在q2

如果在q3中,我们看到一个a,那么现在又有偶数a,只需要一个b。将此新状态称为q4。如果看到b,我们仍然需要一个a,所以我们最好呆在q3

如果在q4中看到a,我们又需要更多a,可以返回到q3。另一方面,如果我们得到一个b,则可以返回到q2,因为该字符串是我们的语言。

DFA如下所示:

 q     s    q'
--    --    --
q0     a    q1        q0: initial state
q0     b    q2        q1: dead state, did not begin with b
q1     a    q1        q2: accepting state, even #a and start/stop with b
q1     b    q2        q3: start with b, odd #a
q2     a    q3        q4: start with b, even #a, stop with a
q2     b    q2
q3     a    q4
q3     b    q3
q4     a    q3
q4     b    q2

要获得正则表达式,我们可以迭代地找到通向每个状态的正则表达式,然后将正则表达式的并集用于接受状态。在这种情况下,只有q2正在接受,因此我们所需的只是该状态的正则表达式。我们迭代进行,并在每个阶段进行替换。

round 0
(q0): e
(q1): (q0)a + (q1)(a+b)
(q2): (q0)b + (q2)b + (q4)b
(q3): (q2)a + (q3)b + (q4)a
(q4): (q3)a

round 1
(q0): e
(q1): a + (q1)(a+b) = a(a+b)*
(q2): b + (q2)b + (q4)b = (b+(q4)b)b*
(q3): (q2)a + (q3)b + (q4)a = ((q2)+(q4))ab*
(q4): (q3)a

round 2
(q0): e
(q1): a(a+b)*
(q2): (b+(q3)ab)b*
(q3): ((q2)+(q3)a)ab* = (q2)ab* + (q3)aab* = (q2)ab*(aab*)*
(q4): (q3)a

round3:
(q0): e
(q1): a(a+b)*
(q2): (b+(q3)ab)b*
(q3): (b+(q3)ab)b*ab*(aab*)* = bb*ab*(aab*)*+(q3)abb*ab*(aab*)* = bb*ab*(aab*)*(abb*ab*(aab*)*)*
(q4): (q3)a

round4:
(q0): e
(q1): a(a+b)*
(q2): (b+bb*ab*(aab*)*(abb*ab*(aab*)*)*ab)b*
(q3): bb*ab*(aab*)*(abb*ab*(aab*)*)*
(q4): bb*ab*(aab*)*(abb*ab*(aab*)*)*a

因此,正则表达式为:

r = (b+bb*ab*(aab*)*(abb*ab*(aab*)*)*ab)b*
  = bb* + bb*ab*(aab*)*(abb*ab*(aab*)*)*abb*
  1. bb*部分对以下事实进行了编码:b的任何字符串都是该语言中的字符串。
  2. 另一部分以bb*开头和结尾,该事实编码任何字符串必须以b开头和结尾的事实
  3. 最外面的a编码为这样的事实,即使用a的语言中的任何字符串都必须同时具有第一个和最后一个a
  4. aab*部分允许成对的a
  5. abb*ab*部分允许存在a的非连续对

最后,上述替换表达式的规则如下:

A: r       r is an expression
B: As      s is an expression
=
A: r
B: rs


A: r + As  r, s are expressions
=
A = rs*

答案 1 :(得分:1)

晚上好!看看

b(aa)* b

这将导致生成以 b

为开头和结尾的字符串

,甚至包含成群的 a (如果有的话) 以2个i-e偶数的倍数产生 a