给定两个正则表达式,确定一个是否为其他的补语

时间:2019-03-03 19:09:58

标签: regex computation-theory dfa

我想知道如何判断某个正则表达式是否是另一个正则表达式的补充。假设我有2个正则表达式r_1和r_2。我当然可以从它们每个中创建一个DFA,然后检查以确保L(r_1)!= L(r_2)。但这并不一定意味着r_1是r_2的补数,反之亦然。同样,似乎许多不同的正则表达式可能是单个正则表达式的相同补码。 因此,我想知道在给定两个正则表达式的情况下,如何确定一个是否是另一个的补充。这对我来说也是新的,所以也许我缺少一些显而易见的东西。

编辑:我应该指出,我不仅仅是在寻找正则表达式的补码。我给了两个正则表达式,我要确定它们是否互为补充。

2 个答案:

答案 0 :(得分:0)

这是一种概念上简单的方法,即使不是十分有效(也不一定有更有效的解决方案...):

  1. 分别为正则表达式r和s构造NFA M和N。您可以使用有限自动机描述相同语言的证明中引入的构造来做到这一点。
  2. 确定M和N以获得M'和N'。我们不妨继续将它们最小化……给出M''和N''。
  3. 使用机器M''和N''上的笛卡尔积机器构造来构造机器C。接受程度将由对称差或XOR准则确定:产品机器中的接受状态对应于成对的状态对(m,n),其中两个状态之一恰好在其自动机中接受。
  4. 最小化C并将结果称为C'
  5. 如果L(r)= L(s)',则C'的初始状态将被接受,并且C'的所有跃迁均始于初始状态,并且也终止于初始状态。如果是这样,

为什么要这样做?两组的对称差是正好是一个(不是两个,也不是两个都不是)的所有事物的集合。如果L(s)和L(r)是互补的,那么不难发现对称差包括所有字符串(根据定义,集合的补码包含集合中未包含的所有内容)。假设现在有非互补集,它们的对称差异是所有字符串的宇宙。这些集合不是互补的,因此(1)它们的联合不是空的,或者(2)它们的联合不是所有字符串的Universe。在情况(1)中,对称差异将不包括共享元素;在情况(2)中,对称差将不包括丢失的字符串。因此,只有互补集的对称差等于所有弦的全域。并且所有字符串集的最小DFA始终具有带有自循环的可接受初始状态。

答案 1 :(得分:-1)

补码:L(r_1)==!L(r_2)