如何判断正则表达式的等价?


Regular Expressions Equivalence

  1. Construct NFA-lambdas corresponding to each RE using Kleene's theorem
  2. Construct DFAs for each using the subset/powerset construction
  3. (optional) Minimize the DFAs using a standard DFA minimization algorithm.
  4. Construct DFAs for L(M1) \ L(M2) and L(M2) \ L(M1) using the Cartesian Product Machine construction
  5. (Optional) Minimize these CPMs.
  6. Determine whether each one accepts any strings by testing all strings over alphabet E of size no greater than |Q| (works due to the pumping lemma for regular languages)

虽然从理论上已经解决了这个问题,但是从计算的角度甚至手算的角度来看,这个方法的结果并不能让人满意。可以说语言本身的计算依赖于自动机由来已久,语言本身的计算却没有发展起来。所以不断有研究从不同的角度,甚至单独从正则表达式空间上定义的一系列运算出发,来验证正则表达式的等价性,而不必将运算映射到DFA空间上去。从数学的角度上看,这样一系列理论的完善是简洁和优美的,这使得正则表达式空间能够是自闭和完备的,重要的结论可以通过该空间本身的性质直接推出,而不需要DFA的辅助。这样的方法也是易于理解,符合人们在学习一个新的代数结构的一般过程。有些时候,这些方法的完善甚至是计算有利的。相关的工作可以参看论文Testing the equivalence of regular expressions [Marco Almeida...etc].

作为抛砖引玉的例子,这里给出几个著名的正则表达式的等价的例子,这些例子在一般性的正则表达式的化简上有一定的经验作用。

\[(a^*b)^* = \varepsilon\ \lvert\ (a\lvert b)^* \tag{1} \]

\[(ab)^* = \varepsilon\ \lvert\ a(ba)^*b\tag{2} \]

\[a^*(a\lvert b)^* = (a\lvert b)^*a^* = b^*(a\lvert b)^* = (a\lvert b)^*b^* = (a\lvert b)^*\tag{3} \]


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM