- •Курс лекций
- •Оглавление
- •Лекция 1 Языки и грамматики Языки
- •ГГрамматики
- •Лекция 2 Конечные автоматы Автоматы
- •Детерминированные конечные автоматы (распознаватели)
- •Языки и детерминированные конечные автоматы
- •Лекция 3 Конечные автоматы Недетерминированные конечные автоматы (распознаватели)
- •Эквивалентность дка и нка
- •Лекция 4 Конечные автоматы Минимизация конечных автоматов
- •Лекция 5 Регулярные выражения и регулярные грамматики
- •Регулярные выражения
- •Связь между регулярными выражениями и автоматными языками
- •Лекция 6 Регулярные выражения и регулярные грамматики Регулярные грамматики
- •Лекция 7 Свойства регулярных языков
- •Замкнутость класса регулярных языков
- •Алгоритмические проблемы регулярных языков
- •Лемма о расширении регулярных языков
- •Лекция 8 Контекстно-свободные языки
- •Контекстно-свободные грамматики
- •Лекция 9 Контекстно-свободные языки
- •Грамматический разбор
- •Неоднозначность грамматик и языков
- •Лекция 10 Преобразования кс‑грамматик и нормальные формы
- •Методы преобразования грамматик
- •Лекция 11 Преобразования кс‑грамматик и нормальные формы
- •Нормальные формы кс-грамматик
- •Лекция 12 Магазинные автоматы Магазинные автоматы
- •Недетерминированные магазинные автоматы
- •Лекция 13 Магазинные автоматы Магазинные автоматы и кс-языки
- •Лекция 14 Магазинные автоматы Детерминированные магазинные автоматы и детерминированные кс-языки
- •Лекция 15 Свойства контекстно-свободных языков
- •Лемма о расширении
- •Свойства замкнутости класса контекстно-свободных языков
- •Лекция 16 Свойства контекстно-свободных языков Некоторые алгоритмические проблемы для кс-языков
- •Предметный указатель
- •Формальные языки и грамматики Курс лекций
Лекция 16 Свойства контекстно-свободных языков Некоторые алгоритмические проблемы для кс-языков
Самой существенной проблемой для любого класса языков, используемых на практике, является проблема вхождения (или проблема принадлежности): L? При обсуждении этой и других алгоритмических проблем для класса КС-языков будем предполагать, что языки заданы своими грамматиками.
Теорема 16.1.
Существует алгоритм, который для любой КС-грамматики и для любой строки определяет, принадлежит строка языку L(G) или нет. Иными словами, проблема принадлежности для КС-языков алгоритмически разрешима.
Доказательство.
Очевидно, можно сразу предположить, что грамматика G имеет нормальную форму Хомского (так как любая КС-грамматика за конечное число шагов может быть приведена к ней с сохранением языка). Пусть
G = (N, T, S, P)
и пусть дана произвольная строка
= a1a2...an.
Определим подстроки строки
ij = ai...aj, i j,
и подмножества
Nij = {A AN, A ij},
где 1 i n, 1 j n. Ясно, что L(G) тогда и только тогда, когда
S N1 n.
Для вычисления Nij заметим, что ANii тогда и только тогда, когда G содержит продукцию A ai. Поэтому Nii может быть вычислено для всех i = 1, 2, ..., n простым просмотром и всех продукций грамматики G. Далее заметим, что для j > i из A выводима ij тогда и только тогда, когда в G существует продукция A BC такая, что B ik и C k+1, j для некоторого k в интервале i k < j. Иначе говоря,
Nij = {A A BC и BNik, CNk+1, j}.
Упорядочивая пары индексов (i, j) в этом выражении, видим, что множества Nij могут быть вычислены в следующей последовательности:
вычисляем сначала N11, N22, ..., Nnn;
затем вычисляем N12, N23, ..., Nn-1, n;
потом вычисляем N13, N24, ..., Nn-2, n;
и так далее.
Ясно, что через конечное число шагов все Nij будут вычислены, в том числе и N1 n, после чего останется убедиться, принадлежит S этому множеству или нет.
Пример 16.2.
Определить, принадлежит ли строка
= aabbb
языку, порожденному КС-грамматикой G
S AB,
A BB a,
B AB b.
Применим описанную в теореме 16.1 процедуру. Заметим, что данная грамматика уже в нормальной форме Хомского, поэтому сразу вычисляем множества Nij, где 1 i 5, 1 j 5:
N11 = {A}, N22 = {A}, N33 = {B}, N44 = {B}, N55 = {B},
N12 = , N23 = {S, B}, N34 = {A}, N45 = {A},
N13 = {S, B}, N24 = {A}, N35 = {S, B},
N14 = {A}, N25 = {S, B},
N15 = {S, B}.
Видим, что SN15, значит, L(G).
Теорема 16.3.
Существует алгоритм, который по любой КС-грамматике
G = (N, T, S, P)
определяет, пуст язык L(G) или нет.
Доказательство.
Предположим, что ε L(G). Это можно сделать, так как приведением грамматики G к ε-свободному виду всегда можно эффективно определить, входит ли ε в L(G), и если ε L(G), то язык не пуст. Итак, пусть ε L(G). Используем алгоритм удаления из G бесполезных символов и продукций. Если при этом S окажется в множестве бесполезных переменных, тогда язык L(G) пуст, а если нет, то L(G) содержит по меньшей мере один элемент.
Теорема 16.4.
Существует алгоритм, который по любой КС-грамматике
G = (N, T, S, P)
определяет, бесконечен язык L(G) или нет.
Доказательство.
Предположим, что G не содержит ни ε-продукций, ни цепных продукций, ни бесполезных символов.
Допустим, что грамматика обладает повторяющимися переменными в том смысле, что существует некоторый нетерминал AN, для которого существует вывод
A A.
Так как G по предположению не имеет ε-продукций и цепных продукций, то и не могут быть одновременно пусты. Так как A не является ни ε-порождающим, ни бесполезным символом, то имеем:
S A
и
A .
Но тогда
S A iAi ii,
для любого i = 1, 2, ..., следовательно, L(G) бесконечен.
Если ни одна из переменных не повторяется в выводах грамматики G, тогда длина любого вывода в G ограничена числом N, а значит, множество всех выводов в G конечно. Следовательно, конечен и язык L(G).
Итак, для построения алгоритма, проверяющего, бесконечен ли язык L(G), достаточно иметь алгоритм проверки наличия в G повторяющихся переменных. Это может быть сделано посредством построения графов зависимостей для переменных таким образом, что дуга (A, B) графа соответствует продукции
A B.
Тогда любая переменная, которая является основанием некоторого цикла, будет повторяющейся переменной в G. Следовательно, G имеет повторяющиеся переменные тогда и только тогда, когда граф зависимостей содержит цикл. В силу конечности графа эта проверка может быть проведена за конечное число шагов, а тем самым, мы получаем алгоритм проверки конечности языка L(G).
В заключение заметим, что далеко не все алгоритмические проблемы для контекстно-свободных языков разрешимы. Так, например, не существует алгоритма для определения, эквивалентны ли две КС-грамматики. Правда, для доказательства этого нужно вначале точно определить, что же такое алгоритм, так как иначе невозможно будет доказать его принципиальное несуществование. Но это уже тема другого курса лекций.