【问题标题】:State Elimination DFA to Regular Expression状态消除 DFA 到正则表达式
【发布时间】:2019-05-05 14:41:39
【问题描述】:

我有几个关于状态消除和术语的问题。

在上面的示例中,DFA 处于接受状态,您必须以符号 0 开始并以 1 结束。

如果我将其转换为正则表达式,则上限为

底部是

这是我的问题,我不知道如何将顶部和底部添加到单个表达式中。我也不完全确定如何进一步消除 q2 符号 1。

会是 0(0*(0+1))1* 吗?

感谢任何可以提供帮助的人!

【问题讨论】:

  • 消除 q2 导致上图 (0+1+)+ (我使用 0+ 来演示 00*。加号在这里并不意味着 |)。第二个是10*1+[10]*([10] 表示(0|1)。同样,加号在这里不表示|)
  • 另外,正则表达式只匹配接受状态。任何拒绝状态都不会反映在正则表达式中。因此,您根本不需要对小写字母(以1 开头)进行建模,因为它永远不会导致接受状态..

标签: regex regular-language finite-automata dfa


【解决方案1】:

有一种更知名且更易于理解的算法可用于完成此任务。

要将 DFA G 转换为正则表达式,我们首先将 G 转换为“GNFA”。让例如 G 是以下 DFA(q 是开始状态):

将DFA转换为GNFA的过程如下:

  1. 添加新的开始状态,并将 epsilon 转换为原始开始状态。
  2. 添加新的接受状态,添加从每个原始接受状态到新添加的接受状态的 epsilon 转换,然后将所有原始接受状态变为正常状态。

这是生成的 GNFA:

然后我们一次删除新开始状态和新接受状态之间的每个状态,调整图表以保持正确性。该过程如下进行:让 x、y 和 z 成为 DFA 中的状态。此外,转换如下:输入 a 上的 x->y、输入 b 上的 y->y 和输入 c 上的 y->z。假设我们要删除 y。对于从某个节点 n 到 y 的每次转换以及从 y 到 m 的每次转换,我们必须添加一个新的转换 n->m。从 n 到 m 的过渡将是从 n 到 y 的过渡的内容,然后是带有 kleene 星的过渡 y->y 的内容,然后是从 y->m 的过渡的内容。在这种情况下,a 上的 x->y,b 上的 y->y 和 c 上的 y->z,在移除状态 y 后,将在a(b*)c 上从 x->z 转换。


考虑我们在图像中的 DFA。移除状态 q 后,我们得到:

移除状态 r 后,我们得到:

最后,在移除 state 之后,我们剩下:

这是我们完整的正则表达式。使用此过程可以完全避免您面临的任何问题。但是,我也会直接回答你的问题。对于初学者来说,上半部分不是你建议的。相反,它将变为: 这简化为: 这是我们最后的正则表达式,因为底部没有接受状态,因此无关紧要。

【讨论】:

    【解决方案2】:

    如果你输入 (0) 你从 (q0) 状态开始然后你可以到达最后;相反,如果您输入 (1),您将无法达到最终结果。所以只考虑状态 (q0) (q1) (q2) 并对这些状态应用消除规则

    消除后RE如下

    0(0)*1 . (1+0(0)*1)*
    

    从 0 开始,到 1 结束

    【讨论】:

      猜你喜欢
      • 2015-12-21
      • 2017-02-09
      • 1970-01-01
      • 2018-04-16
      • 2012-03-10
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      相关资源
      最近更新 更多