📜  如何识别一种语言是否正规

📅  最后修改于: 2021-09-27 15:08:46             🧑  作者: Mango

先决条件 – 正则表达式、正则语法和正则语言、泵引理
有一个很好的定理来确定一种语言是否是规则的,基于鸽子洞原理,称为泵引理。但是pumping lemma是一个否定性测试,即如果一种语言不满足pumping lemma,那么我们可以肯定地说它不是正则的,但如果它满足,那么该语言可能是正则的,也可能不是正则的。 Pumping Lemma 更像是一个数学证明,需要更多时间,有时可能会令人困惑。在考试中,我们需要非常快速地解决这个问题,因此基于常见的观察和分析,这里有一些快速规则可以帮助:

  1. 每个有限集都代表一种正则语言。
    示例 1 – {a, b}* 上所有长度为 2 的字符串,即 L = {aa, ab, ba, bb} 是正则的。
  2. 给定一个非正则语言的表达式,但参数的值受某个常数的限制,则该语言是正则的(意味着它具有某种有限比较)。
    示例 2 – L = { a^n  [特克斯]b^n [/特克斯]| n <= 10 1010 } 是正则的,因为它是有上限的,因此是一种有限语言。
  3. 构成AP(Arithmetic Progression)的字符串模式是规则的(即它的幂是线性表达式的形式),
    但是 GP(几何级数)的模式不是规则的(即它的力量是非线性表达的形式),它属于上下文敏感语言类。
    示例 3 – L = { a^n  | n>=2 } 是常规的。显然,它形成了一个 AP,因此我们可以绘制一个具有 3 个状态的有限自动机。

    示例 4 – L = { a 2n | n>=1 } 不规则。它形成了一个 GP,所以我们不能有一个固定的模式,重复会生成这种语言的所有字符串。
    在示例 4 中,如果 ‘n’ 像 n<10000 一样有界,那么它变成正则,因为它是有限的。

  4. 不存在模式,可以重复以生成语言中的所有字符串是不规则的。使用 FA 无法找到素数本身。
    示例 5 – L = { a^p  | p 是素数。 } 不正常。
  5. 模式(常规)和非模式(非常规)的串联也不是常规语言。
    示例 6 – L 1 = { a^{n}b^{n}  | n≥1 }, L 2 = { a^{n}  n≥1 } 那么 L 1 .L 2不规则。
  6. 每当需要无界存储来存储计数然后与其他无界计数进行比较时,该语言就不是正则的。
    示例 7 – L = { a^n  [特克斯]b^n [/特克斯]| n>=1 } 是不规则的,因为我们需要先存储 a 的计数,然后将其与 b 的计数进行比较,但有限自动机的存储空间有限,但在 L 中,可以有无限多个 a 进入,无法存储。

    示例 8 – L = { w | na(w) = nb(w) } 不规则。

    示例 9 – L = { w | na(w)%3 > nb(w)%3 } 是规则的,因为模数运算需要有界存储,即对于 %3 运算,模数只能是 0、1 或 2,然后对于 b 类似地,它将是 0、1 和2. 因此,DFA 中表示的状态将是 a 和 b 的余数的所有组合。

  7. W, W rx , y 的模式
    • 如果|x|有一定的长度,然后不规则。
      示例 10 – L = { W x W r | W, x 属于{a, b}* 且 |x|=5 } 不规则。如果 W= abb 那么 W r = bba 并且 x = aab,那么组合字符串就是 abb aab bba。现在,可以扩展 x 来消除 W 和 W r ,但是 |x| = 5. 因此,即使在扩展字符串,W=ab、Wr=ba 和 x=baabb。所以,我们没有得到任何形式 (a+b)* 的模式,所以不规则。
    • 如果|x|是无界的,W 属于 (a+b)*,那么把 W 作为 epsilon,W^r 作为 epsilon,如果我们得到 (a+b)* 作为结果,那么语言就是正则的。
      示例 11 – L = { W x W r | W, x 属于 {a, b}* } 是正则的。
      如果 W = abb,则 W r = bba 且 X = aab,因此组合字符串为 abb aab bba。现在,可以扩展 x 以消除 W 和 W r 。因此,在扩展字符串,W=epsilon,W r =epsilon 和 X=abb aab bba。我们得到形式 (a+b)* 的简单模式,可以为其绘制有限自动机。
    • 如果|x|是无界的并且 W 属于 (a+b) + ,然后将 W 作为字母表中的任何符号和相应的 W r ,如果我们仍然可以得到 (a+b)* 的某种组合作为结果,并保证所有字符串将是相同的形式,那么语言是规则的,否则不是规则的。这需要通过示例进行更多解释:

      示例 12 – L = { W x W r | W, x 属于 {a, b}+ } 是正则的。
      如果 W = abb,则 W r = bba 且 x = aab,因此组合字符串为 abbaabbba。现在,可以扩展 X 以消除 W 和 W r ,留下一个符号 a 或 b。在扩展字符串,如果 W=a 则 W r =a,如果 W=b 则 W r =b。在上面的例子中,W r =a。 x=bbaabbb。它简化为以相同符号 a(a+b)*a 或 b(a+b)*b 开始和结束的模式字符串,可以为其绘制有限自动机。

      示例 13 – L = { WW r Y | W, y 属于 {0, 1}+} 不正则。
      如果 W= 101,则 W r = 101 且 Y= 0111,则字符串为 1011010111。如果展开 y,则 W=1,W r =0 且 y=11010111。根据这种扩展,字符串不属于语言本身,这是错误的,因此不是正则的。

      如果 W= 110 则 W r = 011 且 Y= 0111,则字符串为 1100110111。如果 y 展开,则 W=1,Wr=1 且 Y=00110111。这个字符串满足语言要求,但我们不能以此为基础进行概括,因为字符串也可能以 01 和 10 开头。

      示例 14 – L = { x WW r y | x, y, W 属于 {a, b} + } 是正则的。
      如果 X= aaaba,W=ab 和 Y=aab。字符串是 aaaba abbaaab。现在,可以扩展 x 和 y 使得 W 和 W r被吃掉,但留下一个符号为 +,即新值是 X= aaabaa W= b, W r = b。因此,语言被简化为包含 ‘bb’ 或 ‘aa’ 作为子字符串的所有字符串的集合,这是常规的。