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

Алгоритмические проблемы регулярных языков

одной из основных проблем, относящихся к разряду алгоритмических, является так называемая проблема вхождения (или проблема принадлежности): можно ли по данному языку L и данной строке  определить, входит ли строка  в L или нет? Под методом, с помощью которого предполагается находить ответ, понимается алгоритм, решающий проблему вхождения. Если для какого-то класса языков такого алгоритма не существует, то языки этого класса не имеют сколько-нибудь существенных приложений. Помимо проблемы вхождения, имеются и другие проблемы относительно языков, где речь идет о существовании некоторого алгоритма. Все такие проблемы будем называть алгоритмическими. Необходимо, однако, уточнить, что мы понимаем под выражением "задан язык". Дело в том, что существует много способов описания одного и того же семейства языков. Так, для регулярных языков имеется возможность неформального описания языка, представление его в теоретико-множественной нотации, задание с помощью конечного автомата регулярного выражения и регулярной грамматики. Так как для конструирования алгоритмов требуется однозначность исходных данных, то мы остановимся на трех последних способах. Будем называть стандартным представлением регулярного языка задание его или конечным автоматом, или регулярным выражением, или регулярной грамматикой.

Теорема 7.7.

Пусть фиксирован алфавит , тогда существует алгоритм, который для любого регулярного языка L* в стандартном представлении и любой строки   * определяет, входит  в L или нет.

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

Вначале переходим к представлению языка L с помощью конечного автомата (если L был задан в иной форме, т.е. регулярным выражением или регулярной грамматикой). Это можно сделать эффективно за конечное число шагов. Затем строим диаграмму переходов автомата (также за конечное число шагов) и, перебирая все пути, ведущие из начальной вершины и имеющие длину , определяем, есть ли среди них путь, помеченный  и оканчивающийся в одной из заключительных вершин (это тоже осуществимо за конечное число шагов). Если такой путь найдется, то делаем вывод, что   L, а если нет, то   L.

Описанный алгоритм универсален в том смысле, что он дает ответ на вопрос "  L?" для любой пары (L, ). Это отражает массовый характер алгоритмической проблемы, что является чрезвычайно важным обстоятельством. Именно оно придает значение любому алгоритму, так как освобождает от необходимости в каждом частном случае изобретать каждый раз новый метод решения проблемы.

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

Теорема 7.8.

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

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

Как и в предыдущей теореме, строим диаграмму переходов ДКА, допускающего данный язык. Если существует путь без циклов из начальной вершины в одну из финальных вершин, то язык непустой, в противном случае - язык пустой. Для определения, является язык конечным или нет, выписываем все вершины, которые являются основаниями циклов, и проверяем, находится ли хоть одна из них на пути от начальной вершины к какой-нибудь финальной. Если такой путь существует, то язык бесконечен; в противном случае язык конечен. Для завершения доказательства достаточно заметить, что такая проверка осуществляется за конечное число шагов, т.е. алгоритм всегда сходится.

Теорема 7.9.

Существует алгоритм, который по стандартному представлению любых двух регулярных языков L1 и L 2 определяет, равны ли они.

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

Пусть даны два регулярных языка L1 и L2. Построим новый язык

L3 = (L12)  (1L2).

Очевидно, L3 – тоже регулярный язык. Кроме того, нетрудно заметить, что L1 = L2 тогда и только тогда, когда L3 = . Но по теореме 7.8 существует алгоритм, который для любого языка выясняет, пуст ли он. Применив его в данном случае к языку L3, получаем ответ на вопрос, равны ли L1 и L2.

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