问题描述
嗨,我正在尝试找出将正则表达式 L = (a+ab)* 表示为 DFA 并生成 L 的正则语法。
因此,如果您从 DFA 获得常规语法,
A-> aB | BC |
B-> aB |巴|
C-> aC | BC
但问题是,当你得到这个语法的正则表达式时,你得到一个更复杂的表达式,而不是 (a+b)*。
C = aC + bC = (a+b)*
B = aB + bA + e = a*(bA+e)
A = aB + bC + e = aa* bA + aa* + b(a+b) + e = (aa* b)* (aa* +b(a+b)*+e)
我想知道我的解决方案是否有问题。
解决方法
其实X = (aa*b)*(aa*+b(a+b)*+e) 可以简化为(a+b)*。在这里,我试图解释我将 X 简化为 (a+b)* 的步骤:
- 我们将简化分为三个部分:
a) empty string
、b) every possible string starting with b
、c) every possible string starting with a
。如果我们能得到这些,就意味着 X=(a+b)*。 - 如果将第一部分 (aa*b)* 取为 e 并查看第二部分,您将看到我们可以得到
a) empty string
和b) every possible string starting with b
。我们只需要获得c) every possible string starting with a
。 - 这部分是一场斗争,但我想我得到了它。现在我们只查找以 a 开头的字符串。首先,我们在第二部分有 aa* 获得所有“a”。此外,如果我们有 2 个或更多连续的“b”,则字符串的其余部分将被第二部分 b(a+b)* 接受。所以唯一的问题是单个'b'。最后,第一部分得到单个‘b’。
尽管它很复杂(并且可能是不必要的),但这是 X=(a+b)* 的证明。结果,您的解决方案是正确的。