{a^nb^n | n >= 0}
我能理解这不是一个正则表达式,因为没有有限状态自动机/机器可以验证和接受这个输入,因为它缺少一个记忆组件。(如果我错了,请纠正我) 正则语言的维基百科条目也列出了这个例子,但没有提供证明为什么它不是正则的(数学上)。
有谁能为我解惑并提供证明,或者指引我去一个好的资源?
{a^nb^n | n >= 0}
原因是,当输入字符串中'a'和'b'的数量相等时,您必须仅到达最终状态。为了做到这一点,您必须计算出 'a' 和 'b' 的数量,但由于'n'的值可能会达到无穷大,因此使用有限自动机无法计数到无穷大。
这就是为什么 {a^n b^n | n >= 0} 不是正则的原因。
有限状态自动机没有数据结构(栈)-与下推自动机的情况不同。它可以给你一些'a'后面跟着一些'b',但不能给出确切数量的'a'以及后面没有'b'。
泵引理可用于证明一个语言不是正则的,
例如:
令 L = {a^mb^m | m ≥ 1}
那么 L 不是正则的。
证明:
假设 L 是正则的。
令 n 为泵引理中的数。
令 w = a^nb^n。
令 w = xyz 满足泵引理的条件。
现在 y 只包含 'a',因为 |xy|<= n 且 i = 2 ( 在 xy^iz 中 )。
因此,xy^2z ∈ L,但是 xy^2z 包含比 b 更多的 a。
这与第一个假设相矛盾,所以它不是正则的。
让我用一个例子来解释:
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
后:
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
。