手工简化正则表达式**的技巧**

时间:2012-10-28 05:04:35

标签: regex regular-language

我正在努力证明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)*)似乎都没有效果。

所以问题是:

  1. 这是一个循序渐进的转型过程吗?如果是的话,你能告诉我它是如何完成的吗?
  2. 如果证明需要其他类型的技术,它们是什么?
  3. 有明确的&综合参考解释用于简化正式RE的技术?
  4. 感谢。

1 个答案:

答案 0 :(得分:6)

有很多方法可以做到这一点。

一种简单的方法是将正则表达式转换为NFA。要查看两个NFA是否识别相同的语言:

  1. 考虑两个NFA的起始状态。

  2. 对每个NFA考虑你正在考虑的州的epsilon。

  3. 如果一个NFA的状态集包含至少一个接受状态,但另一个NFA的状态不包含接受状态,则NFA不相等而且您已完成。

  4. 否则,对于每个符号,请按照该符号为每个NFA获取一组新状态,然后返回步骤1.

  5. 这将需要有限数量的步骤,因为需要考虑有限数量的状态集。

    你也可以将正则表达式转换为最小的DFA并显示它们是等形的,但这种技术实际上与上述技术相同,但步骤顺序不同。

    插图

    考虑RE aa*a*a。它们显而易见它们识别相同的语言,但我们将用它们来说明算法。

    NFAs

    1. 首先,我们考虑每个NFA的起始状态。左侧RE为{1},右侧RE为{1},我们将其写为{1},{1}

    2. 然后我们采用epsilon闭包,即{1},{1,2}

    3. 两个集都没有包含结束状态,所以我们继续。

    4. 传出符号仅为a,因此我们会将所有a转换为{2},{1,3}

    5. epsilon闭包是{2,3},{1,2,3}

    6. 两者都包含结束状态,所以我们继续。

    7. 同样,传出符号为a,因此我们将所有a转换为{2},{1,3}

    8. epsilon闭包是{2,3},{1,2,3}。这与步骤#5相同,所以我们不再这样做了。

    9. 由于没有其他任何东西需要检查,我们已经完成了,并且两者已被证明是相同的。