- •Оглавление
- •Предисловие
- •Языки
- •Грамматики
- •Автоматы
- •Эквивалентность ДКА и НКА
- •Минимизация конечных автоматов
- •Регулярные выражения
- •Регулярные грамматики
- •Замкнутость класса регулярных языков
- •Лемма о расширении регулярных языков
- •Контекстно-свободные грамматики
- •Грамматический разбор
- •Неоднозначность грамматик и языков
- •Методы преобразования грамматик
- •Нормальные формы КС-грамматик
- •Магазинные автоматы
- •Недетерминированные магазинные автоматы
- •Магазинные автоматы и КС-языки
- •Лемма о расширении
- •Предметный указатель
решений не существует в принципе, а соответствующие проблемы называются алгоритмически неразрешимыми.
Лемма о расширении регулярных языков
Следующий результат, известный как Лемма о расширении регулярных языков (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 |
|