1) Проблема принадлежности:
Дано описание языка L и цепочка a. Принадлежит ли цепочка a языку L. Существует алгоритм, который за конечное количество шагов решает эту проблему.
Дано: А – автомат, a – цепочка.
Выход: «Да», если aÎL(A). «Нет», если aÏL(A).
Метод решения: распишем цепочку a посимвольно: a= a1a2…an.
Обозначим z1= t(z0, a1), z2= t(z1, a2), …, zn= t(zn-1, an).
Если znÎF (где F – множество заключительных состояний), то цепочка a принадлежит языку L. В противном случае – нет.
2) Проблема пустоты: Дано определение языка. Пустой ли этот язык.
Дано: конечный автомат А.
Выход: «Пустой» или «Непустой» язык L(A).
Метод: Найти множество состояний, достижимых из начального состояния. Если это множество содержит какое-либо заключительное состояние, то ответ «Да», иначе – «Нет». Множество достижимых состояний находят перебором всех возможных путей в графе автомата.
3) Проблема эквивалентности: Даны два определения языка. Определить, описывают ли они один и тот же язык.
Дано: 2 конечных автомата А1= (X1, Z1, t1, z01, F1) и А2= (X2, Z2, t2, z02, F2).
|
|
Предполагаем, что множества состояний этих автоматов не пересекаются: Z1ÇZ2= Æ.
Выход: «Да» – если L(A1) = L(A2), «Нет» – если L(A1) ¹ L(A2).
Метод: построим объединенный автомат А: (X1 È X2, Z1 È Z2, t1 È t2, z0, F1 È F2).
Определим, различимы ли конечные состояния данного автомата. Если они различимы, то «Нет», иначе – «Да».
Вопросы и упражнения
1. Почему данные проблемы называют алгоритмическими?
2. Как доказывается, что они разрешимы?