Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СОКОЛОВЛЕКЦИИ.pdf
Скачиваний:
119
Добавлен:
28.05.2015
Размер:
919.88 Кб
Скачать

решений не существует в принципе, а соответствующие проблемы называются алгоритмически неразрешимыми.

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

Следующий результат, известный как Лемма о расширении регулярных языков (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 такую, что

|α| = k m = n+1.

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

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

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

Лекция 7

63

 

k + 1 > n + 1,

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

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

причем, очевидно, можно считать, что последовательности q0, qi, qj,

..., qr и qr, ..., qf уже не содержат повторяющихся элементов.

Но тогда должны существовать подстроки β, γ, δ строки α такие, что

θ*(q0, β) = qr, θ*(qr, γ) = qr, θ*(qr, δ) = qf,

причем |βδ| ≤ n+1 = m и |γ| ≥ 1. Отсюда непосредственно получаем, что

θ*(q0, βδ) = qf,

а также

θ*(q0, βγ2δ) = qf, θ*(q0, βγ3δ) = qf,

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

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

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

64

Свойства регулярных языков

может использоваться для доказательства регулярности какого-то языка.

Пример 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 = z, убеждаемся, что ни в одном из случаев α2 не принадлежит L, что противоречит утверждению Леммы о расширении. Следовательно, наше первоначальное предположение о регулярности языка L неверно, т.е. язык {anbm | n 0} не является регулярным.

Пример 7.12.

Лекция 7

65

 

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

L = {anbm | n m, n 0, m 0}

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

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

L1 = L L(a* b*).

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

66

Свойства регулярных языков

Контекстно-свободные

 

Лекция

языки

8

 

 

 

Как мы уже показали, не все языки регулярны. Так, например, применив лемму о расширении регулярных языков, мы убедились, что язык L = {anbn | n 0} не является регулярным.

В то же время легко распознать в нем так называемую скобочную структуру, входящую во многие языки программирования. Эта структура соответствует простому правилу: число открывающих скобок в программе должно совпадать с числом закрывающих скобок. В терминах языка L строки (()), ((())) принадлежат L, а строка ((() – нет. Для того чтобы включить в рассматриваемый класс этот и многие другие языки, введем понятие контекстно-свободного языка и контекстно-свободной грамматики. Для этого класса языков мы рассмотрим проблему грамматического разбора, или синтаксического анализа, заключающуюся в том, чтобы по данной строке определить, выводима ли она в данной грамматике. Изучение этой проблемы очень важно для разработки языков программирования и построения компиляторов, так как лексический анализ - это необходимая фаза трансляции языка, а все известные нам языки программирования являются контекстно-свободными.

Лекция 7

67

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]