我正在为我的编译器类做一些预考试练习,需要简化这个正则表达式。
(a U b)*(a U e)b* U (a U b)*(b U e)a*
很明显,e是空字符串,U代表联合。
到目前为止,我认为其中一个(a U b)*可以删除,因为U a = a的并集。但是,我找不到任何其他简化,到目前为止其他问题做得不好。 :(
非常感谢任何帮助!
答案 0 :(得分:3)
首先翻译成该语言的英文描述:
(a U b)*(a U e)b* U (a U b)*(b U e)a*
转换为:
a
或b
s的任意序列,后跟可选的a
,后跟任意数量的b
。
OR
任意数量的a
和b
,然后是可选的b
,随后是任意数量的a
此处有很多重叠 - 至少(a U b)*(a U e)
与(a U b)*
完全相同,因为“a
s和b
s的任意序列”必然以a
或epsilon结尾(因为任何字符串都可以以epsilon结尾)所以这些组可以被删除,留下
(a U b)*b* U (a U b)*a*
转换为:
a
或b
s的任意序列,后跟任意数量的b
s。
OR
任意数量的a
和b
s,以及任意数量的a
s
现在,最外层组的第一部分是相同的,所以让我们将它们合并为一个
(a U b)*(a* U b*)
转换为:
a
或b
s的任意序列,后跟任意数量的a
个OR,任意数字b
s。
现在等一下,“As和Bs的任何序列”必然以“a
s的任意序列或b
s的任何序列”结束,意味着匹配第一部分的任何东西都可以匹配整个正则表达式(因为第二部分的长度可以为零)所以我们为什么不这样做呢
(a U b)*
塔达。简单。
答案 1 :(得分:1)
我认为整件事情等同于(a U b)*
(或大多数正则表达式语法,(a|b)*
)
答案 2 :(得分:1)
正则表达式上有点生锈,但如果*仍然表示“零次或多次出现”,则可以替换:
(a U e)b* for (a U b)*
将第一部分留下:
(a U b)*(a U b)* = (a U b)*
在右侧,你有那个
(b U e)a* = (b U a)*
现在,由于U b = b U a,你得到:
(a U b)*(a U b)*
在右侧,只留下
(a U b)* U (a U b)* = (a U b)*
我认为就是这样......
答案 3 :(得分:0)
我会告诉你如何解决它:(不是很正式,也不保证)
看看主U的左侧:
(a U b)* - 这是什么意思?长度为n的a和b的组合,其中n> = 0。
接下来(美国)。我们有什么在这里?一个或一个空字。如果我们想要的话,我们可以在上一部分中得到它。如果我们想要e,那么无论如何我们都可以把它留下来。请注意,我们不必采取a,因为我们可以选择e。所以我们可以跳过整个部分。
下一步是什么? B *。那是什么?和我们想要的一样多。我们本来可以在第一部分得到那些!我们可以把它留下来!
所以左边唯一的东西是(a U b)*。
让我们看看右侧:
好的,现在很容易,我们可以使用相同的想法,它只是不同的字母。
我们也会以同样的方式得到(a U b)*。
所以最后我们有(a U b)* U(a U b)*你知道它等于(a U b)*。