【问题标题】:Simplification of REGEX expressionREGEX 表达式的简化
【发布时间】:2014-03-10 03:37:08
【问题描述】:

我需要证明或反驳下面的正则表达式

(RS + R )* R = R (SR + R)*
// or, for programmers:
/(RS|R)*R/ == /R(SR|R)*/

我有强烈的直觉认为它们是等价的,但是我如何使用 REGEX 的法则逐步证明。

【问题讨论】:

  • 是的,它们是等价的。你已经开始证明了吗?你在什么时候卡住了?我们不会简单地为您做作业:-)

标签: regex computer-science regular-language


【解决方案1】:

是的,第一个正则表达式等于第二个。

我不能给你正式的证明,因为我不太擅长证明,但我可以给你一个暗示,这些表达式是相等的。

您可以手动枚举示例,如下所示:

1.) 我可以产生 e(epsilon) 吗?

  • (RS + R)* 可以是ε

  • R 不能为 epsilon

  • 连接 2 = (epsilon)R 或简单地 = R

所以你可以形成的最基本的字符串是'R'。现在继续推导字符串的过程,你会得出两个正则表达式相等的结论。

【讨论】:

    【解决方案2】:

    首先了解这种形式语言的含义:

    (RS + R)*R = R(SR + R)*
    

    从 LHS,(RS + R)* 用于生成 RSR 的任意组合,包括 ^ epsilon。一些示例字符串为{^, RS, RSRS, RRRS, RSR,...}:字符串始终以R 开头,但可以以SR 结尾——我们可以用英语来描述:R 可以以任何组合出现,其中S 总是后跟一个R(不可能有两个连续的S)。

    并且,完整的 LHS 回复 (RS + R)*R 意味着字符串始终以 R 结尾。

    现在,考虑以下示例:

    1. R + SS + R 一样,基本上是union
    2. 但是RS不能写成SR,串联时顺序很重要
    3. (RS)R 可以写成R(SR)
    4. (RS)*R 可以写成R(SR)*,两者都一样就是RSRSRS...SR
    5. (AB + AC) 可以写成A(B + C)
    6. (AB + A)可以写成A(B + ^),这是因为A = ^A = A^
    7. (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 
    

    对于正则表达式,相同的步骤是正确的。

    【讨论】:

    • 感谢您在证明之前列出规则 =))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多