Почему {a^nb^n | n >= 0} не регулярно?
В курсе CS, который я беру, есть пример языка, который не является регулярным:
{a^nb^n | n >= 0}
Я могу понять, что это не регулярно, так как не может быть написан конечный автомат / машина, которая проверяет и принимает этот ввод, так как в нем отсутствует компонент памяти. (Пожалуйста, поправьте меня, если я ошибаюсь)
Запись в Википедии о регулярном языке также перечисляет этот пример, но не предоставляет (математического) доказательства, почему он не является регулярным.
Может ли кто-нибудь просветить меня в этом и предоставить доказательства этого или указать мне слишком хороший ресурс?
7 ответов
То, что вы ищете, это лемма Pumping для обычных языков.
Вот пример с вашей точной проблемой:
Примеры:
Пусть L = {am bm | m ≥ 1}.
Тогда L не является регулярным.
Доказательство: пусть n будет таким же, как в лемме прокачки.
Пусть w = an bn.
Пусть w = xyz, как в лемме о накачке.
Таким образом, xy2 z ∈ L, однако, xy2 z содержит больше a, чем b.
Потому что вы не можете написать конечный автомат, который будет "считать" идентичные последовательности символов "a" и "b". Короче говоря, ФСМ не могут "сосчитать". Попробуйте представить себе такого автомата: сколько штатов вы бы дали символу "а"? Сколько нужно "б"? Что если в вашей входной последовательности больше?
Обратите внимание, что если бы у вас было n <= X с целочисленным значением X, вы могли бы подготовить такой FSM (имея одно с большим количеством состояний, но все же конечное число); такой язык будет регулярным.
Причина в том, что вы должны достичь конечного состояния только тогда, когда нет. из "а" и нет. из 'b' во входной строке равны. А для этого нужно посчитать и то, и другое, нет. как "а", так и "нет". из 'b', но поскольку значение 'n' может достигать бесконечности, невозможно считать до бесконечности с использованием конечных автоматов.
Так вот почему {a^n b^n | n >= 0} не является регулярным.
Предположим, что L = {anbn | n ≥ 0} регулярно. Тогда мы можем использовать лемму о накачке.
Пусть n - номер леммы о накачке. Рассмотрим w = an bn∈L. Лемма о накачке утверждает, что вы можете разделить w на xyz так, чтобы xy ≤ n, y ≥ 1 и ∀ i∈ℕ0: xyi z∈L.
Используя первые два правила, мы можем легко увидеть, что независимо от того, как мы делим w на xyz, y всегда будет состоять только из s и будет содержать по крайней мере одну такую букву. С помощью правила 3 заключаем, что an-kbn∈L, где k = |y| ≥ 1. Но пк ≠ п нарушает определение L, так, что напк бн∉L. Это противоречие и заключаем, что предположение о регулярности L неверно.
Конечный автомат не имеет структуры данных (стека) - памяти, как в случае с автоматом нажатия. Да, это может дать вам несколько "а", затем несколько "б", но не точное количество "а", за которым следует "нет".
Лемму о накачке можно использовать для опровержения того, что язык не является регулярным,
Пример:
Пусть L = {a^mb^m | м ≥ 1}
Тогда L не является регулярным.
Доказательство. Предположим, что L регулярно.
Пусть n такое же, как в лемме о накачке.
Пусть w = a^nb^n.
Пусть w = xyz соответствует лемме о накачке.
Теперь y содержит только 'a', так как |xy|<= n и i = 2 (в xy^iz).
Таким образом, xy^2z ∈ L, однако xy^2z содержит больше a, чем b.
Что противоречит первому предположению, поэтому оно не является регулярным.
Поясню здесь на примере:
L = {а^nb^n | п >= 0};
Строка минимальной длины, принятая в L:
{ε, ab, aabb, ...} => минимум w = ab;
не брал, так как для
n == 0
, никогда не может быть.
давайте сначала возьмем
x = ε
, тогда и
z = b
или и , так как
|y| > 0
а также
|xy| <= 2
(поскольку это бесконечный язык,
p
(здесь 2) может быть максимальной длины ссылки на строку здесь )
после откачки
y = a
:
L' = ааб, аааб, ааааб, аааааб;
после откачки
y = ab
:
L' = абаб, абабаб, абабаб;
Теперь возьми
x = a
, тогда и
z = ε
; после откачки
y = b
:
L' = абб, аббб, аббб, абббб;
Снова проверьте w = aabb : w находится в L;
за
x
может быть
ε, a, aa, aab
, то может быть
a, aa, bb, ab, aab, ... aabb
а также
z
может быть
ε, b, bb, abb
;
Во всех приведенных выше случаях после прокачки любой длины
y
не будет принято в
L
.
L'
либо имеет неравные a, b, либо порядок не соответствует определению. Следовательно
L = {a^n.b^n | n >= 0};
не является регулярным, так как не соответствует лемме о накачке для регулярных языков .