正则表达式等价

时间:2011-10-17 18:48:03

标签: regex finite-automata regular-language

以下正则表达式是否等效?为什么或为什么不呢?

(ab)* u (aba)* = (ab u aba)*

  

* = Kleene star

     

u =联盟(设定理论)

2 个答案:

答案 0 :(得分:5)

不,他们不等同。 RHS上的语言包含“abaab”,但LHS上的语言不包含。这些之间有什么关系吗?是;但我不会只给你答案。 提示:RHS中是否有任何字符串不在LHS中?

编辑:

为感兴趣的读者解释一下。语言是字符串集。因此,集合之间的关系也是语言之间的关系。最常见的集合关系是相等,子集和超集。给定宇宙集U1和U2上的两个集A和B,集合A是宇宙集U1 u U2下的B的子集(u代表并集)iff的每个元素也是B的元素。类似地,给定两个集合A宇宙集U1和U2上的B和集合A,集合A是宇宙集U1 u U2(u代表联合)的B的超集,如果B的每个元素也是A的元素(等价,iff B是A的子集) 。集合A和B是相等的iff A是B的子集,B是A的子集(等效地,iff A是B的超集,B是A的超集)。注意,两组A和B不必处于这三种关系中的任何一种;当A包含不在B中的元素时,会发生这种情况,同时B包含不在A中的元素。

要找出集合A和B之间存在四种可能关系中的哪一种 - 相等,子集,超集,无 - 您通常检查A是否是B的子集以及B是否是A的子集。调用第一个检查B1和第二检查B2,其中B1和B2是布尔变量,并且如果检查通过则为真(即,在B1的情况下A是B的子集,并且在B2的情况下B是A的子集)。然后(B1&& B2)对应于相等,(B1&& B2)对应子集,(!B1&& B2)对应超集,(!B1&& B2)对应没有关系。

在上面的例子中,我通过证明RHS包含不在LHS中的元素来证明两种语言不相等。请注意,这也排除了“A是B的超集”关系。剩下两个:B是A的超集,或者它们之间没有关系。要确定这一点,您必须确定A是否是B的子集; LHS语言中的元素是否都是RHS语言。如果是这样,LHS就是一个子集;否则,没有关系。

为了表明一组中有一个元素而不是另一个元素,最简单和最有说服力的方法是反例证明:在一个中命名一个字符串,而不是另一个。这是我采用的方法。您还可以创建一个参数,语言必须包含这样的元素,而不必明确命名它;这种证明可能更难以正确。

要显示集合A的每个元素也在集合B中,您将需要更通用的校对技术。通过归纳证明和矛盾证明是常见的例子。要进行归纳证明,您可以明确地或隐式地为语言中的每个字符串分配一个自然数,证明您的声明(在这种情况下,该元素也是另一个集合的元素)与一个简单的参数一致。然后,您假设对于集合中的前n个元素(根据您给出的编号)是正确的,并且表明这意味着之后的所有元素也必须满足您的声明。要做一个矛盾的证明,你假设与你想证明的相反,并产生矛盾。如果你成功并且你唯一的假设是你的主张是错误的,那么你的主张一直都是真的。

答案 1 :(得分:1)

不,它们不相同。

<强>相似点:

  1. 都接受空字符串
  2. 都接受“ababa” regex2 的最小表达)
  3. <强>差异:

    1. ab aba 可能会在 regex1 中出现一次,与 regex2 不同,可能会出现或者没有,但结合在一起。
    2. 由于我们有所不同,我们可以说它们不相同。

      <强> BUT

      由于正则表达式是常规语言的表示(不是描述),您无法分辨 regex1 等同于< strong> regex2 只需查看表达式,证明它(数学证明)就可以将这些正则表达式转换为 NFA (非确定性有限自动机)或DFA(确定性有限自动机)和比较不同之处。