Не удалось преобразовать из NFA в DFA


11

У меня есть простая проблема создания DFA, который принимает все входные данные, начинающиеся с двойных букв (aa, bb) или заканчивающиеся двойными буквами (aa, bb), учитывая, что является набором алфавита данный язык.Σзнак равно{a,б}

Я попытался решить это окольным путем:

  1. Генерация регулярного выражения
  2. Делая его соответствующим NFA
  3. Использование конструкции powerset для вывода DFA
  4. Минимизация количества штатов в DFA

Шаг 1: Регулярное выражение для данной проблемы (среди множества других):

((aa|bb)(a|b)*)|((a|b)(a|b)*(aa|bb))

Шаг 2: NFA для данного выражения:

NFA
(источник: livefilestore.com )

В табличной форме NFA:

State    Input:a     Input:b
->1        2,5         3,5
  2        4           -
  3        -           4
 (4)       4           4
  5        5,7         5,6
  6        -           8
  7        8           -
 (8)       -           -

Шаг 3. Преобразование в DFA с использованием конструкции powerset:

Symbol, State       +   Symbol, State (Input:a) +   Symbol, State (Input:b)
   ->A, {1}         |        B, {2,5}           |        C, {3,5}
     B, {2,5}       |        D, {4,5,7}         |        E, {5,6}
     C, {3,5}       |        F, {5,7}           |        G, {4,5,6}
   (D), {4,5,7}     |        H, {4,5,7,8}       |        G, {4,5,6}
     E, {5,6}       |        F, {5,7}           |        I, {5,6,8}
     F, {5,7}       |        J, {5,7,8}         |        E, {5,6}
   (G), {4,5,6}     |        D, {4,5,7}         |        K, {4,5,6,8}
   (H), {4,5,7,8}   |        H, {4,5,7,8}       |        G, {4,5,6}
   (I), {5,6,8}     |        F, {5,7}           |        I, {5,6,8}
   (J), {5,7,8}     |        J, {5,7,8}         |        E, {5,6}
   (K), {4,5,6,8}   +        D, {4,5,7}         +        K, {4,5,6,8}

Шаг 4: сверните DFA:

Сначала я изменил K-> G, J-> F, I-> E. На следующей итерации H-> D и E-> F. Итак, финальная таблица:

  State    +   Input:a     +   Input:b
   ->A     |      B        |      C
     B     |      D        |      E
     C     |      E        |      D
    (D)    |      D        |      D
    (E)    |      E        |      E

И схематически это выглядит так:

Окончательный DFA
(источник: livefilestore.com )

... который не является обязательным DFA! Я трижды проверил мой результат. Итак, где я ошибся?

Замечания:

  • -> = начальное состояние
  • () = конечное состояние

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

Приятно себя чувствовать, спасибо! ^^
Анураг Калия

Ответы:


5

Вы в порядке до шага 3 (DFA), но ваша минимизация неверна.

Понятно, что свернутый DFA не верен, потому что оба входа baи ab(которые не на языке оригинала и не приняты DFA на шаге 3) приводят к конечному состоянию E.

Глядя на ваши шаги минимизации, кажется, что вы объединили конечные и не конечные состояния; например, J (финал) -> F (не финал) и I (финал) -> E (не финал). Слияние конечного состояния с неконечным состоянием изменяет язык, принимаемый автоматом, что приводит к принятию неверных строк, как отмечено выше.


1
Ой. Итак, вот что создает проблему здесь. Теперь, когда я помню, в прошлый раз, когда я использовал этот метод, в таблице не было никаких особых принимающих состояний!
Анураг Калия
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.