如何根据正则语法得到正则表达式?

问题描述

问题是

正则文法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ε + ε

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

解决方法

我们首先写一些方程:

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 项,进行因式分解,然后注意到 + 10 项不添加任何内容,从而稍微简化 S 的表达式:

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,数量超过 2 次,然后当且仅当第三部分选择 1如果 n 是奇数。

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

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