我正在努力证明RE
s(bs)*[(abb*a*)*ab]*aa(a∪b)
其中s=b*a*ab
可以简化为
(a∪b)*abaa(a∪b)
,
但我知道的所有常规转换(例如(ab)*a=a(ba)*
或(a*b)*a*=(a∪b)*
)似乎都没有效果。
所以问题是:
感谢。
答案 0 :(得分:6)
有很多方法可以做到这一点。
一种简单的方法是将正则表达式转换为NFA。要查看两个NFA是否识别相同的语言:
考虑两个NFA的起始状态。
对每个NFA考虑你正在考虑的州的epsilon。
如果一个NFA的状态集包含至少一个接受状态,但另一个NFA的状态不包含接受状态,则NFA不相等而且您已完成。
否则,对于每个符号,请按照该符号为每个NFA获取一组新状态,然后返回步骤1.
这将需要有限数量的步骤,因为需要考虑有限数量的状态集。
你也可以将正则表达式转换为最小的DFA并显示它们是等形的,但这种技术实际上与上述技术相同,但步骤顺序不同。
考虑RE aa*
和a*a
。它们显而易见它们识别相同的语言,但我们将用它们来说明算法。
首先,我们考虑每个NFA的起始状态。左侧RE为{1}
,右侧RE为{1}
,我们将其写为{1},{1}
。
然后我们采用epsilon闭包,即{1},{1,2}
。
两个集都没有包含结束状态,所以我们继续。
传出符号仅为a
,因此我们会将所有a
转换为{2},{1,3}
。
epsilon闭包是{2,3},{1,2,3}
。
两者都包含结束状态,所以我们继续。
同样,传出符号为a
,因此我们将所有a
转换为{2},{1,3}
。
epsilon闭包是{2,3},{1,2,3}
。这与步骤#5相同,所以我们不再这样做了。
由于没有其他任何东西需要检查,我们已经完成了,并且两者已被证明是相同的。