我需要证明或反驳以下REGEX
(RS + R )* R = R (SR + R)*
// or, for programmers:
/(RS|R)*R/ == /R(SR|R)*/
我有一种强烈的直觉,认为它们是等同的,但我如何使用REGEX的法律逐步证明。
答案 0 :(得分:4)
首先要了解这种正式语言的含义:
(RS + R)*R = R(SR + R)*
从LHS,(RS + R)*
用于生成RS
和R
的任意组合,包括^
epsilon。一些示例字符串为{^, RS, RSRS, RRRS, RSR,...}
:字符串始终从R
开始,但可以S
或R
结尾 - 我们可以用英语描述:R
可以出现在S
始终跟随一个R
的任何组合(两个连续S
都不可能)。
并且,完整LHS的重新(RS + R)*R
表示字符串始终以R
终止。
现在,请考虑以下示例:
R + S
与S + R
相同,基本上是联合RS
无法写为SR
,顺序在连接中很重要(RS)R
可以写成R(SR)
(RS)*R
可以写成R(SR)*
,两者都是RSRSRS...SR
(AB + AC)
可以写成A(B + C)
(AB + A)
可以写成A(B + ^)
,这是因为A = ^A = A^
(BA + A)
可以写成(B + ^)A
。正式证明:
(RS + R)*R // LHS => (R(S + ^))*R // from rule 6 => R((S + ^)R)* // from rule 4 => R(SR + R)* // from rule 7, in revers `(B + ^)A` --> `(BA + A)` // RHS
正则表达式的相同步骤是正确的。
答案 1 :(得分:0)
是的,第一个正则表达式等于第二个。
我不能给你正式的证据,因为我不是很精通证明,但我可以暗示这些表达是平等的。
您可以手动枚举示例,如下所示:
1。)我可以生成e(epsilon)吗?
(RS + R)*可以是epsilon
R不能是epsilon
连接2 =(epsilon)R或简称= R
所以你可以形成的最基本的字符串是'R'。现在继续推导字符串的过程,你会得出2正则表达式相等的结论。