形式语言理论(正则表达式和正则语言)-“或”的概念

时间:2019-01-13 06:19:40

标签: regex logic regular-language formal-languages

好的,因此在将逻辑或符号(通常为||)应用于操作数a和b时,即|| b,表示a或b可以为真,或者两者都可以为真。如果只希望一个为真,请使用XOR(有时是^符号)。

但是,在形式语言理论中,“或”(通常为+符号)的概念似乎暗含“异或”(xor)而不是常规“或”。例如,如果我们用正则表达式aa + bb + ab描述语言L,则来自该语言的有效字符串(单词)将是其中之一(aa,bb或ab),而不是它们的某些串联。为此,您必须使用Kleene闭包,例如(aa + bb + ab)*,对吗?

也许我只是想将+定义为一种特殊的方式,或者可能是操作数不再是布尔值?

如果我似乎正在理解+(OR)在形式语言/计算模型中的含义与在编程语言中的含义似乎有所不同,我只是在寻求验证。谢谢!

2 个答案:

答案 0 :(得分:0)

正式语言OR 是包含性(“常规”)的OR。例如,常规语言ab* + a*b 包括 ab*a*b中的字符串(即字符串ab)。

答案 1 :(得分:0)

问题不在于运算符-正则表达式中的+确实与集的并集具有相同的含义-问题在于您对操作数的理解。具体来说,在您的正则表达式aa + bb + ab中,aa并不代表字母上的 string ,而是一个次正则表达式。正则表达式描述字符串的 sets ;因此正则表达式aa描述了字符串{aa}的集合。因此,正则表达式aa + bb + ab描述了一组字符串{aa}联合{bb}联合{ab} = {aa,bb,ab}。集合论的异或(对称差)在正则表达式语法中没有运算符。我们可以递归定义正则表达式的语言,为正则表达式r写成L(r),如下所示:

  • L(r)= {r},如果r是字母上的字符串;
  • L(r)= L(s)L(t),如果r = st;
  • L(r)= L(s)*,如果r = s *;
  • 如果r = s + t,则L(r)= L(s)并集L(t)。