Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[01] Соколов В.А. Формальные языки и грамматики....doc
Скачиваний:
97
Добавлен:
29.10.2018
Размер:
1.44 Mб
Скачать

Лемма о расширении регулярных языков

следующий результат, известный как Лемма о расширении регулярных языков (Pumping Lemma) основан на том простом замечании, что в диаграмме переходов с n вершинами любой путь длины, большей или равной n, должен содержать цикл, т.е. повторяющуюся вершину.

Теорема 7.10.

Пусть L бесконечный регулярный язык. Тогда существует целое число m > 0 такое, что для любой строки   L, длина которой   m, возможно представление

 = ,

где   0 и   m, такое, что для любого i = 0, 1, 2, ... строка

i = i

также принадлежит L.

Доказательство.

Если язык L регулярный, тогда существует ДКА M, который распознает его. Пусть

q0, q1, ..., qn

– множество всех состояний автомата M. Возьмем любую строку   L такую, что

 = km = n+1.

Так как по предположению L бесконечен, то такая достаточно длинная строка всегда найдется. Рассмотрим все те состояния автомата M, через которые он проходит, когда прочитывает строку ; пусть это будут состояния

q0, qi, qj, ..., qf.

Так как эта последовательность имеет k + 1 вершину и

k + 1 > n + 1,

то, как минимум, одна вершина должна повториться, по крайней мере, на n-м шаге. Таким образом, последовательность должна иметь следующий вид:

q0, qi, qj, ..., qr, ..., qr, ..., qf .

причем, очевидно, можно считать, что последовательность q0, qi, qj, ..., qr ,…, qr уже не содержит других повторяющихся элементов, кроме последнего qr .

Но тогда должны существовать подстроки , ,  строки  такие, что

*(q0, ) = qr,

*(qr, ) = qr,

*(qr, ) = qf,

причем   n+1 = m и   1. Отсюда непосредственно получаем, что

*(q0, ) = qf,

а также

*(q0, 2) = qf,

*(q0, 3) = qf,

и так далее, что и завершает доказательство.

Заметим, что Лемма о расширении применима только к бесконечным языкам, так как любая достаточно длинная строка языка сразу порождает бесконечное множество строк этого же языка.

Впрочем, это не является недостатком, так как все конечные языки заведомо регулярны, а Лемма о расширении главным образом применяется для доказательства того, что какой-то данный язык не является регулярным. Это доказательство всегда проводится по принципу "от противного", чтобы затем получить противоречие. Но, как и любое другое необходимое условие, Лемма о расширении не может использоваться для доказательства регулярности какого-то языка.

Пример 7.11.

Показать, используя Лемму о расширении, что язык

L = {an bn n  0}

не является регулярным.

Допустим противное, т.е. что язык L – регулярный. Тогда для L справедлива Лемма о расширении, а значит, и должно существовать такое m, что если  = n > m, где   L, то  можно представить в виде   .

Для строки  возможны три случая:

1)  = аk,

2)  = bt

3)  = akbt.

В каждом из этих случаев мы получаем:

1) i = an - k (ak)i bn,

2) i = an (bt)i bn - t,

3) i = an - k (akbt)i bn - t.

Полагая i = 2, убеждаемся, что ни в одном из случаев 2 не принадлежит L, что противоречит утверждению Леммы о расширении. Следовательно, наше первоначальное предположение о регулярности языка L неверно, т.е. язык {anbnn  0} не является регулярным.

Пример 7.12.

Показать, что язык

L = {anbmn m, n  0, m  0}

не является регулярным.

Можно и здесь попытаться прямо использовать Лемму о расширении, но мы дадим более изящное решение, опирающееся на предыдущий пример. Допустим, что L – регулярный язык. Тогда регулярным должен быть и язык

L1 = L(a* b*).

Но L1 = {an bnn  0} и, как уже было показано, не является регулярным. Следовательно, и L не может быть регулярным.