【问题标题】:How to get regular expression based on regular grammar?如何根据正则语法得到正则表达式?
【发布时间】:2021-06-24 17:02:20
【问题描述】:

问题是

正则文法G的生成规则是

S → 0A | 1B | ε , A → 1B | ε , B → 0A |ε, 

将 L(G) 表示为正则表达式。

我的解决方法如下。

S = 0A + 1B+ ε
A = 1B + ε
B = 0A + ε

然后

S = 0(1B + ε) + 1(0A + ε) = 1(0A + 0B + ε) + 0ε + ε

我不知道如何在这里简化表达式了。在这方面的任何帮助将不胜感激。

【问题讨论】:

  • 有可能吗?我的意思是我们这里有递归。另一方面,这似乎是10 的交替序列。
  • 已部署?我不明白。
  • 我在这里看到了一个可能的解决方案math.stackexchange.com/a/1139940/128761
  • 顺便说一句:你的1(0A + 0B + ε) + 0ε + ε 对我来说看起来不对,似乎是因为你在0(1B + ε) + 1(0A + ε) 中忘记了+ ε
  • 不,这不是正则表达式,我们需要消除非终结符 AB。你的正则表达式的元符号是什么?是* 重复(0..n)吗?我想我们不会比我已经链接到的(01)∗+(10)∗+(01)∗0+(10)∗1 更好。

标签: regex regular-language formal-languages


【解决方案1】:

我们先写一些方程:

S = 0A + 1B + e
A = 1B + e
B = 0A + e

我们可以通过替换来消除 B:

S = 0A + 1(0A + e)+ e = 0A + 10A + 1 + e
A = 1(0A + e)+ e = 10A + 1 + e
B = 0A + e

我们现在可以消除 A 中的递归:

S = (0 + 10)A + 1 + e
A = (10)*(1 + e)
B = 0A + e

现在我们可以通过替换来消除 A:

S = (0 + 10)(10)*(1 + e) + 1 + e
A = (10)*(1 + e)
B = 0(10)*(1 + e) + e

我们可以通过观察常见的 1 + e 项、因式分解来稍微简化 S 的表达式,然后注意到 + 10 项没有添加任何内容:

S = (0 + 10)(10)*(1 + e) + 1 + e
  = [(0 + 10)(10)* + e](1 + e)
  = (0 + e)(10)*(1 + e)

这似乎是 {0, 1} 上的所有字符串的语言,既不包含 00 也不包含 11。为了证明这一点,我们可以证明正则表达式生成所有此类字符串,并且它仅生成此类字符串。

表达式生成的任何字符串都是三个字符串的串联:第一个不能以 1 结尾,最后一个不能以 0 开头,中间不能以 0 开头,也不能以 1 结尾。因此,字符串 00 和 11不能在边界处形成。同样清楚的是,这三个都不可能包含 00 或 11。因此,表达式生成的任何内容都既没有 00 也没有 11。

可以生成任何不带 00 或 11 的字符串。假设一些这样的字符串以 x 开头,长度为 n。

如果 n > 0 且 x = 0,则表达式从第一部分中选择 0,10 次等于 n 减一,数量超过 2 次;然后,当且仅当 n 为偶数时,它从第三部分中选择 1。

如果n> 0和x = 1,则表达式选择第一部分的E,需要10次等于n减去一个,数量超过两个,次,然后选择1,如果只为第三部分选择1如果 n 是奇数。

如果 n = 0,则表达式为第一部分和第三部分选择空字符串,并取 10 个零次。

在所有三种情况下,正则表达式都能够生成字符串。因为表达式生成我们语言中的所有字符串且仅生成字符串,所以它是我们描述的语言的正则表达式。

【讨论】:

  • 我们看到(0 + e)(10)*(1 + e) 等价于(1 + e)(01)*(0 + e)。在这种情况下,是否有一些规范的形式表明更喜欢一种?顺便说一句:很好的解释,我已经在寻找一个很好的介绍了。这是一个很好的例子,理论信息学如何在实践中发挥作用。
  • @Wolf 可能不会。我想知道如果我们先解决并替换 A,然后再做 B,我们是否会得到另一种形式?我们通过应用规则机械地得到这种形式,直到我们求解 S。一般来说,将有无限多个等价表达式,其中许多在运算长度方面可能相似。
  • 非常感谢。我试图放弃,因为我无论如何也解决不了,但这对我有很大的帮助。
  • @bongbong 如果这个答案对您有帮助,那么接受这是正确的做法(回答者获得+15,您获得+2)
猜你喜欢
  • 1970-01-01
  • 2014-02-21
  • 2011-03-22
  • 2011-08-23
  • 2012-05-06
  • 2010-09-20
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多