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

Лекция 16 Свойства контекстно-свободных языков Некоторые алгоритмические проблемы для кс-языков

Самой существенной проблемой для любого класса языков, используемых на практике, является проблема вхождения (или проблема принадлежности): L? При обсуждении этой и других алгоритмических проблем для класса КС-языков будем предполагать, что языки заданы своими грамматиками.

Теорема 16.1.

Существует алгоритм, который для любой КС-грамматики и для любой строки  определяет, принадлежит строка  языку L(G) или нет. Иными словами, проблема принадлежности для КС-языков алгоритмически разрешима.

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

Очевидно, можно сразу предположить, что грамматика G имеет нормальную форму Хомского (так как любая КС-грамматика за конечное число шагов может быть приведена к ней с сохранением языка). Пусть

G = (N, T, S, P)

и пусть дана произвольная строка

 = a1a2...an.

Определим подстроки строки 

ij = ai...aj, i  j,

и подмножества

Nij = {AAN, A ij},

где 1  i  n, 1 j  n. Ясно, что L(G) тогда и только тогда, когда

SN1 n.

Для вычисления Nij заметим, что ANii тогда и только тогда, когда G содержит продукцию Aai. Поэтому Nii может быть вычислено для всех i = 1, 2, ..., n простым просмотром  и всех продукций грамматики G. Далее заметим, что для j > i из A выводима ij тогда и только тогда, когда в G существует продукция ABC такая, что B ik и C k+1, j для некоторого k в интервале i  k < j. Иначе говоря,

Nij = {AABC и 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ii,

для любого i = 1, 2, ..., следовательно, L(G) бесконечен.

Если ни одна из переменных не повторяется в выводах грамматики G, тогда длина любого вывода в G ограничена числом N, а значит, множество всех выводов в G конечно. Следовательно, конечен и язык L(G).

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

A  B.

Тогда любая переменная, которая является основанием некоторого цикла, будет повторяющейся переменной в G. Следовательно, G имеет повторяющиеся переменные тогда и только тогда, когда граф зависимостей содержит цикл. В силу конечности графа эта проверка может быть проведена за конечное число шагов, а тем самым, мы получаем алгоритм проверки конечности языка L(G). 

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