【问题标题】:Why is {a^nb^n | n >= 0} not regular?为什么是 {a^nb^n | n >= 0} 不规则?
【发布时间】:2011-01-19 13:35:43
【问题描述】:

在我正在学习的 CS 课程中,有一个不规则语言的示例:

{a^nb^n | n >= 0}

我可以理解这是不规则的,因为无法编写有限状态自动机/机器来验证和接受此输入,因为它缺少内存组件。 (如有错误请指正)

wikipedia entry on Regular Language 也列出了这个例子,但没有提供(数学)证明它为什么不规则。

谁能启发我并为此提供证据,或者给我指出一个很好的资源?

【问题讨论】:

    标签: computer-science fsm regular-language


    【解决方案1】:

    你要找的是Pumping lemma for regular languages。

    这里是 example 与您的确切问题:

    示例:
    令 L = {ambm | m≥1}。
    那么 L 不是正则的。
    证明:令 n 与 Pumping Lemma 相同。
    令 w = anbn。
    让 w = xyz 就像在 Pumping Lemma 中一样。
    因此,xy2z ∈ L,然而,xy2z 包含的 a 比 b 多。

    【讨论】:

    • 谢谢,正是我想要的。
    • 最后的声明需要更好的解释。 x2yz 单词要么包含更多的一类字母(如果 y 的 a 多于 b,反之亦然),或者复制它会破坏字母顺序,其中 b 应该排在所有 a 之后。
    • 证明不完整。你还没有定义 x,y,z。 x 的限制只有 | xy |
    • 证明遗漏了一些部分,因此它是不正确的。加上链接坏了。
    【解决方案2】:

    因为您无法编写一个有限状态机来“计数”相同的“a”和“b”符号序列。简而言之,FSM 无法“计数”。试着想象这样一个 FSM:你会给符号“a”多少个状态? “b”有多少?如果你的输入序列有更多呢?

    请注意,如果你有 n

    【讨论】:

      【解决方案3】:

      有限状态自动机没有数据结构(堆栈)-内存,就像下推自动机一样。是的,它可以给你一些'a',然后是一些'b',但不是'a'的确切数量,然后是'b'。

      【讨论】:

        【解决方案4】:

        原因是,只有在没有的情况下,你才必须达到最终状态。 'a' 和没有。 'b' 在输入字符串中相等。要做到这一点,你必须同时计算两者,没有。 'a' 以及没有。 'b' 的值,但因为 'n' 的值可以达到无穷大,所以使用有限自动机无法计数到无穷大。

        这就是为什么 {a^n b^n | n >= 0} 不规则。

        【讨论】:

          【解决方案5】:

          假设 L = {anbn | n ≥ 0} 是正则的。然后我们可以使用抽水引理。

          令 n 为抽水引理数。考虑 w = anbn∈L。抽水引理指出,您可以将 w 划分为 xyz,使得 xy ≤ n、y ≥ 1 和 ∀ i∈ℕ0: xyiz∈L.

          使用前两条规则我们可以很容易地看出,无论我们如何将 w 划分为 xyz,y 总是只包含 as 并且它将包含至少一个这样的字母。根据规则 3,我们得出结论 an-kbn∈L 其中 k = |y| ≥1。但是nk≠n违反了L的定义,所以ankbn∉L。这是一个矛盾?,我们得出结论,L 是正则的假设是错误的。

          【讨论】:

            【解决方案6】:

            让我在这里举例说明:

            L = {a^n.b^n | n >= 0};

            L 中接受的最小长度字符串是:

            {ε, ab, aabb, ...} => 最小值 w = ab;

            我没有使用n == 0,因为对于n == 0,y 永远不可能是|y| > 0。

            我们先来x = ε,然后y = a和z = b或y = ab和z = ε,因为|y| > 0和|xy| <= 2(因为它是一种无限的语言,p(这里是2)可以与字符串长度一样最大reference here)

            抽完y = a:

            L' = aab, aaab, aaaab, aaaaab;

            抽完y = ab:

            L' = abab, ababab, abababab;

            现在,取x = a,然后取y = b 和z = ε; 抽完y = b:

            L' = abb, abbb, abbbb, abbbbb;

            再次检查 w = aabb : w 在 L 中;

            对于x 可以是ε, a, aa, aab, 那么y 可以是a, aa, bb, ab, aab, ... aabb 而z 可以是ε, b, bb, abb;

            在上述所有情况下,L' 在抽取任何长度的y 后生成的L 都不会被接受。 L' 要么 a、b 不相等,要么顺序不符合定义。因此,L = {a^n.b^n | n >= 0}; 不规则,因为它失败了Pumping lemma for regular languages。

            【讨论】:

              猜你喜欢
              • 2015-06-11
              • 2015-05-04
              • 2022-10-18
              • 2021-12-11
              • 2015-06-26
              • 2022-06-28
              • 2013-10-18
              • 1970-01-01
              • 2013-02-16
              相关资源
              最近更新 更多