【问题标题】:Regular expression over the language C={a,b}语言 C={a,b} 上的正则表达式
【发布时间】:2019-04-01 18:37:11
【问题描述】:

大家晚上好,我被以下正则表达式卡住了,

我认为表达方式比我的要简单得多,

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

我的尝试是进入案件,但结果不是很好:

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

但我认为这并不完整。

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

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

【问题讨论】:

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


    【解决方案1】:

    晚上好!看看吧

    b(aa)*b

    这导致生成的字符串在 b

    上开始和结束

    并且包含偶数团a(如果有的话) 以 2 的倍数产生 a,即偶数

    【讨论】:

      【解决方案2】:

      在这里创建 DFA 似乎更容易,因此我们可以从那里开始并从中派生正则表达式。

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

      如果我们在这种状态下看到a,我们正在查看一个不以b 开头的字符串,因此无论接下来发生什么我们都无法接受它。我们可以用一个新的、死亡的状态来表示这一点。我们称之为q1

      如果我们在q0 中看到b,我们需要一个新状态来表示我们正在顺利看到符合条件的字符串这一事实。实际上,字符串bb 开头和结尾,并且有偶数个a(零是偶数);所以这个状态一定是接受的。打电话给q2

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

      如果我们在q2 中看到b,我们的情况与以前相同(偶数个a,最后一次看到b,所以我们可以接受)。留在q2

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

      如果在q4 中我们看到a,我们再次需要更多as 并且可以返回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. 最外层的as 编码了这样一个事实:语言中的任何带有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*
      

      【讨论】:

      • 哎呀,这是一个复杂的正则表达式。从问题的描述bb*(ab*a|b)*bb* 应该可以做到。如果你想接受字符串"b",那么在表达式前面加上b|
      • @Welbog 在 17 个符号和 38 个符号之间的什么时候,正则表达式从简单到复杂?至少这个具有使用愚蠢的机械过程衍生的好处。毕竟是星期一早上。
      猜你喜欢
      • 2013-10-13
      • 2021-01-10
      • 2015-07-06
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多