【问题标题】:find a regular expression for the language accepted by the following automata找到以下自动机接受的语言的正则表达式
【发布时间】:2019-10-19 05:58:00
【问题描述】:

找到以下自动机接受的语言的正则表达式。

  1. 消除q1

    q0: ab
    q2: ba*
    q0 to q2: b+aa
    q2 to q0 : bb
    
  2. 消除q2

    q0: ab+b+aa(ba)*
    

(不确定我的方法是否正确)

【问题讨论】:

  • 从 q0 到 q3 的箭头上那个奇怪的符号是什么?
  • 为什么q2: ba*中有*
  • 这是作业吗?
  • 我不知道如何正式做到这一点,但如果 q0 -> q3 是一个 epsilon 转换,你不应该以类似 ((a|bb)(ab)*b)* 的方式结束吗?

标签: regex automata dfa minimization


【解决方案1】:

有两条规则:

  1. 如果X -> sY -> rXt 则可以将后者替换为Y -> rst
  2. 如果是X -> sX | r,那么您可以将其替换为X -> s*r

此 DFA 的常规语法如下:

(q0) -> b(q2) | a(q1) | (q3)
(q1) -> b(q0) | a(q2)
(q2) -> b(q1)
(q3) -> lambda

我们可以开始消除状态。 (q3) 很容易摆脱:

(q0) -> b(q2) | a(q1) | lambda
(q1) -> b(q0) | a(q2)
(q2) -> b(q1)

我们可以很容易地摆脱 (q2):

(q0) -> bb(q1) | a(q1) | lambda
(q1) -> b(q0) | ab(q1)

我们需要去掉 (q1) 产生式中的自引用:

(q0) -> (bb+a)(q1) | lambda
(q1) -> (ab)*b(q0)

现在,我们可以去掉 (q1):

(q0) -> (bb+a)(ab)*b(q0) | lambda

现在,让我们摆脱自引用:

 (q0) -> ((bb+a)(ab)*b)*

所以,正则表达式 ((bb+a)(ab)*b)* 应该可以工作。这让我们回到状态 (q0) 和 (q3),接受状态,处于 (q0) 的 lambda-closure 中。尝试几个术语表明我们找到了一个很好的表达方式。

【讨论】:

  • 我以为你直到最后才能消除最终和初始状态,而你确实消除了 q3 第一步......我很困惑
  • @Fulla 我认为我所做的基本上是隐含地使用状态 q0 和 q3 在 lambda 闭包意义上是等效的这一事实,因此我将它们视为相同的状态。另一种方法可能是编写另一种常规语法(终端符号在右侧)和相应的归约规则,然后以这种方式直接为 q3 导出一些东西。这可能会更清楚一点,然后您将直接求解 q3 而不是 q0 并单独飞跃以将 q0 视为接受,因为它处于 lambda 闭包中。
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2019-05-16
  • 2017-02-11
相关资源
最近更新 更多