Существует гораздо более известный и понятный алгоритм для выполнения этой задачи.
Чтобы преобразовать DFA G в регулярное выражение, мы сначала преобразуем G в 'GNFA'.Пусть, например, G будет следующим DFA (q - начальное состояние):
Процесс преобразования DFA в GNFA выглядит следующим образом:
- Добавить новое начальное состояние с эпсилон-переходом в исходное начальное состояние.
- Добавить новое принятие, добавить эпсилон-переходы из каждого исходного состояния в новое добавленное состояние принятия, затемсделать все исходные принимаемые состояния нормальными.
В результате получится GNFA:
Затем мы удалим каждоесостояние между новым начальным состоянием и новым принимаемым состоянием по одному, корректируя график для поддержания корректности.Процесс работает следующим образом: пусть x, y и z будут состояниями в нашем DFA.Кроме того, переходы выглядят следующим образом: x-> y на входе a, y-> y на входе b и y-> z на входе c.Скажем, мы хотим удалить y.Для каждого перехода от некоторого узла n к y и для каждого перехода от y к m мы должны добавить новый переход n-> m.Переход от n к m будет являться содержимым перехода от n к y, за которым следует содержание перехода y-> y с клиновой звездой, а затем содержание перехода от y-> m.В этом случае x-> y на a, y-> y на b и y-> z на c, после удаления состояния y произойдет переход из x-> z в a(b*)c
.
Рассмотрим наш DFA на изображениях.После удаления состояния q получаем:
После удаления состояния r получаем:
Наконец, после удаления состоянияs у нас осталось:
Это наше полное регулярное выражение.Использование этого процесса полностью исключает любые проблемы, с которыми вы сталкиваетесь.Однако я также предоставлю вам прямой ответ на ваш вопрос.Для начала, верхняя часть не будет тем, что вы предложили.Вместо этого оно станет: Это упрощается до: Это наше последнее регулярное выражение, поскольку нижняя часть не имеет состояния принятия и, следовательно, не имеет значения.