正则表达式之间的对等

时间:2019-03-03 19:08:03

标签: regex regular-language automata dfa

我有两个不同的正则表达式:

(1)($ + b)a *(b + bba *)*
($是空语言)

(2)b *(a + bb + bbb)* b *

我想证明两个表达式是等效的,但我不知道该怎么做。我有两个想法,但是我不知道如何实现它们。

  1. 将两个表达式都转换为DFA。然后最小化两个DFA,并检查它们是否相同。我认为此选项是最正式的选项,但我不知道该如何获取。我知道如何使用Arden的引理从DFA转换为其正则表达式,但不知道反函数。

  2. 简化两个表达式以使其相等。例如,我尝试使用公因子来简化它们,但是我不能使它们相等。

2 个答案:

答案 0 :(得分:0)

(2)需要很多重写和等效规则,才能在一般情况下保证这一点。当然,如果您只是想针对这两个特定的正则表达式执行此操作,则可以临时工作。

(1)是执行此操作的“真实”方法。令您惊讶的是,您知道如何使用Arden的引理,但没有相反的方向,这是更常见的(在教科书和实践中)并且更容易。从字面上看,任何正式的语言书籍或任何编译器书籍都会为您提供至少一种将正则表达式映射到DFA并最小化DFA的算法。如果您无权访问此类书籍,请向我指出我很久以前写的两篇文章,每一篇都提出了一种算法的分类法(当时是全面的),一种用于将正则表达式映射到DFA,另一种用于最小化DFA: http://www.kornai.com/EFS/OnlineSupportMaterial/Watson/Papers/constax.600dpi.ps https://www.researchgate.net/publication/2247379_A_Taxonomy_of_Finite_Automata_Minimization_Algorithms

最后,更全面的工作是在我自己的phd中,从1995年开始,名为“常规语言算法的分类和工具包”。

顺便说一句,我还要提到有很多工具包可以用多种语言来实现这些算法。

最诚挚的问候,布鲁斯

答案 1 :(得分:0)

对我来说,选项1似乎更好,可能是因为我不知道如何可行地完成选项2。我建议这样做:

  1. 构造一个DFA M1,使L(M1)=($ + b)a *(b + bba *)*
  2. 构造DFA M2,使得L(M2)= b *(a + bb + bbb) b
  3. 构造DFA M12,使L(M12)= L(M1)\ L(M2)
  4. 构造DFA M21,使L(M21)= L(M2)\ L(M1)
  5. 如果L(M12)和L(M21)均为空,则正则表达式描述的语言相同

要查看DFA M是否接受空语言,您可以:

  1. 通过最小化M来构造M'
  2. 通过检查初始状态是否为空并让所有从初始状态开始的转换终止于初始状态来查看M'是否接受空语言

要最小化DFA,您可以首先列出DFA的每对状态。然后,删除任何一对,其中一对中的一个接受状态,另一个不接受。然后,迭代地删除任何对(q,q'),其中q进入符号s上的某个状态p,q'进入符号s上的某个状态p',并且(q,q')已被删除。继续进行下去,直到无法再消除成对的状态为止。此时,任何未删除的对都表示输入自动机中的等效状态,并且可以在最小自动机中组合。这只是一种方法。其他方法也可用。

q    s    q'
q0   a    q1
q0   b    q2
q1   a    q1
q1   b    q3
q2   a    q2
q2   b    q3
q3   a    q3
q3   b    q0

在这里,q0是初始的,q3正在接受。我们尝试第一种算法:

    q0    q0    q0    q1    q1    q2
    q1    q2    q3    q2    q3    q3
#   --    --    --    --    --    --
1               XX          XX    XX   // q0,q1,q2 are not accepting; q3 is
2   XX    XX                           // on input b these go to q2,q3
3                                      // can't cross out q1,q2 by any rule

我们发现q1和q2是等价的,可以结合起来得出以下等价的DFA:

q    s    q'
q0   a    q12
q0   b    q12
q12  a    q12
q12  b    q3
q3   a    q3
q3   b    q0

从正则表达式构造自动机的方法如下:

  1. 如果r = x,其中x是语言字母表上的某个字符串,则可以通过为x的每个符号添加一个初始状态和一个附加状态来构造r的NFA;然后,使这些状态中的最后一个接受;
  2. 如果r = st,并且M和M'是s和t的NFA,则可以通过将M的所有接受状态更改为不接受,同时将lambda过渡添加到之前的初始状态来构造r的NFA。 M',不再是开头。
  3. 如果r = s + t,并且M和M'是s和t的NFA,则可以通过将具有lambda跃迁的新初始状态添加到M和M'的先前初始状态来构造r的NFA。不再是初始的;
  4. 如果r = s *并且M是s的NFA,则可以通过将具有lambda过渡的新接受初始状态添加到M的先前初始状态,同时添加来自先前接受状态的lambda过渡来构造r的NFA M到这个新的初始状态。

一旦拥有正则表达式的NFA,就可以使用幂集或子集构造来确定它。为此,请创建一个DFA,该DFA对NFA状态集的每个子集都有一个状态。然后,如果输入符号s使NFA从状态x变为状态y,则添加从子集X到子集Y的过渡,其中x在X中,y在Y中。注意:如果可以帮助您先删除lambda过渡,则可以考虑一下,或使用以下约定:如果s将NFA从q移至q',并且存在从q'到q''的λ跃迁,则s还将NFA从q移至q''。初始状态是仅包含NFA初始状态的状态;所有包含接受状态的状态都在接受。

这将使您完成步骤1和2。此时,按照步骤5的建议进行最小化可能会有所帮助。接下来,使用笛卡尔积机器构造来找到差异的DFA(或仅构造一个DFA)。机的对称差异并保存一个步骤)。产品机器中的每个状态将对应于一对状态,一个状态取自第一输入机,另一个状态取自第二输入机。然后,在产品机器中添加转换,以使DFA从状态(x,y)转换为状态(x',y'),无论在第一台机器中同时存在从x到x'的转换,还是从DFA中的y到y'第二台机器。初始状态是与输入机器中的一对初始状态相对应的状态。接受状态是(对于差异)具有x接受且y不接受的状态(对于对称差异,它们是具有x接受或y接受但不同时具有两者的状态)。