例如,在给我的作业中,我们被要求找出两个正则表达式是否相等。
(a+b+c)* and ((ab)**c*)*
我的问题是如何做到这一点?如果我为两者绘制转换图,然后通过它运行一些字符串并显示两个 TG 都能够接受它,这是一个充分的证据吗?如果没有,我该怎么做?对此有数学/公理化方法吗?
提前致谢。
编辑:我想澄清另一件事,这与这个问题有关。下图中描绘的两个 FA 是否相同?
即上图中的(1)和(2)是一样的吗?
例如,在给我的作业中,我们被要求找出两个正则表达式是否相等。
(a+b+c)* and ((ab)**c*)*
我的问题是如何做到这一点?如果我为两者绘制转换图,然后通过它运行一些字符串并显示两个 TG 都能够接受它,这是一个充分的证据吗?如果没有,我该怎么做?对此有数学/公理化方法吗?
提前致谢。
编辑:我想澄清另一件事,这与这个问题有关。下图中描绘的两个 FA 是否相同?
即上图中的(1)和(2)是一样的吗?
有一个算法可以确定它们是否相等:
- 使用 Kleene 定理构造对应于每个 RE 的 NFA-lambdas
- 使用子集/幂集构造为每个构造 DFA
- (可选)使用标准 DFA 最小化算法最小化 DFA。
- 使用笛卡尔积机器构造为 L(M1) \ L(M2) 和 L(M2) \ L(M1) 构造 DFA
- (可选)最小化这些 CPM。
- 通过测试大小不大于 |Q| 的字母 E 上的所有字符串来确定每个字符串是否接受任何字符串 (由于常规语言的抽引引理而起作用)
不需要新奇或天才;您可以编写一个程序来执行此操作(尽管在实践中,使用 powerset 构造可能很笨拙,并且未能在两个步骤中最小化可能代价高昂)。
编辑:是的,那些 DFA 是一样的。第一个只是第二个的简写符号。
如果由 R 定义的语言(即由正则表达式 R 生成的字符串集合)等于由 T 定义的语言,则两个正则表达式 R 和 T 是等价的。为了证明正则表达式的等价性,我们使用集合论的包含证明. 也就是说,如果 S1 是正则表达式 R 生成的字符串集合,S2 是正则表达式 T 生成的字符串集合,我们必须证明 S1 ⊆ S2 和 S2 ⊆ S1。这两个方向都是证明集合相等所必需的。
-- 摘自 CSc 4340 GSU Fall 09 的讲义(Dr. Raj Sunderraman)
假设
( ( a b )* * c* )*
实际上是((ab)*c*)*
*,^
和包裹$
。那些正则表达式不一样。
abccabcc
不会匹配(a+b+c)*
但会匹配((ab)*c*)*
我是怎么找到这个的?
当我仔细观察这些模式时,我发现了两件事。
{1,}
。所以总会有a序列和b序列并排。像 aaaabb、aabbbbb 等。但在第二种模式中,a 和 be 将与单个实例并排。比如ab、ababab、abababab等。它们是不同的,这很容易通过量词来判断。对于第一个匹配任何内容的表达式,它必须包含一个c
. 第二个显然可以没有c
. (还有更多差异,但这应该可以帮助您入门)。
((ab)^^c^)^=(a^b^c^)^ = (a+b+c)^
由于这是家庭作业,我不会给你完整的答案,但我会告诉你你需要知道的关键事实:对于给定的有限状态语言,以最少状态数识别它的 DFA 是唯一的。
顺便说一句,我不相信你的教授会在不教你如何做的情况下分配这个作业。离开互联网并阅读您的讲义和/或教科书。