Построение детерминированного конечного автомата, равного недетерминированному автомату - PullRequest
0 голосов
/ 30 января 2019

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

Проблема

Вот таблица переходов NFA:

 Q | s | Q'
===|===|===
q0 | a | q0
q0 | b | q0
q0 | b | q2
q0 | - | q1
q1 | b | q2
q1 | b | q4
q2 | a | q3
q3 | - | q4
q4 | a | q3

q3 и q4 принимают, а q0 - начальное состояние.Символ - в столбце s обозначает переход episilon / lambda.

1 Ответ

0 голосов
/ 30 января 2019

Множество Q состояний: {q0, q1, q2, q3, q4}.Состояния вашего эквивалентного DFA будут извлечены из набора всех подмножеств состояний из NFA, из которых 2^5 = 32.Некоторые из них могут быть недоступны, поэтому мы можем ввести только те, которых мы на самом деле достигаем.

Начальное состояние в DFA будет подмножеством состояний NFA, содержащих q0, наряду с любыми состояниями, достижимыми из q0 путем обхода.только эпсилон / лямбда переходы.Здесь начальное состояние DFA: {q0, q1}, поскольку q0 является начальным состоянием NFA, а q1 достижимо из q0, пройдя только (ровно один) эпсилон / лямбда-переход.

Теперь нам нужнопереходы, выходящие из состояния {q0, q1} для каждого символа в алфавите: a и b.Состояние, в которое {q0, q1} переходит при входе a, является подмножеством всех состояний, содержащих только те состояния, которые достижимы из q0 или q1 в NFA, путем потребления ровно одного a и прохождения произвольного числа эпсилон / лямбда-переходов.Символ a заставляет NFA переходить в q0, если он уже находится в q0, и q1 достижим из q0, пройдя переход эпсилон / лямбда;поэтому q0 и q1 будут в подмножестве, которому соответствует это следующее состояние.Поскольку q1 не переходит на a в NFA, это состояние ничего не добавляет: {q0, q1} переходит на {q0, q1} на входе a.На входе b q0 переходит в себя и q2 в NFA (и q1 также, так как q1 достижимо от q0 переходом эпсилон / лямбда).В NFA q1 переходит к q4 и q2 в NFA, поэтому эти состояния также находятся в подмножестве, которому соответствует наше состояние.Следовательно, {q0, q1} переходит к {q0, q1, q2, q4} на входе b.

Единственное состояние, с которым мы столкнулись, для которого у нас нет переходов, это {q0, q1, q2, q4}.На входе b мы можем достичь каждого из этих состояний из какого-то другого (q1, взяв переход эпсилон / лямбда после перехода к q0 из q0);но Q3 не может быть достигнуто так.Таким образом, {q0, q1, q2, q4} переходит к себе на вход b.На входе a мы можем достичь q0 (следовательно, q1) из q0;ничего из q1;и q3 (следовательно, q4 переходом эпсилон / лямбда) из q2 или q4.Следовательно, {q0, q1, q2, q4} переходит на {q0, q1, q3, q4} на входе a.

Единственное состояние, с которым мы столкнулись, для которого у нас нет переходов, это {q0, q1, q3, Q4}.На входе a убедитесь, что мы достигли того же состояния {q0, q1, q3, q4}.На входе b убедитесь, что мы достигли состояния {q0, q1, q2, q4}.

Нет состояний, для которых нам не хватает переходов.Теперь мы можем перечислить состояния, дав им более короткие имена: {q0, q1} - A;{q0, q1, q2, q4} - B;{q0, q1, q3, q4} равно C. Теперь таблица переходов выглядит следующим образом:

 Q | s | Q'
===|===|===
 A   a   A
 A   b   B
 B   a   C
 B   b   B
 C   a   C
 C   b   B

Принимающими состояниями будут любые наши состояния, которые соответствуют подмножествам, содержащим состояния NFA, которые былипринятие в NFA: либо q3, либо q4.Оба состояния B и C содержат состояние q4, которое принимается в NFA;так что B и C принимают.Язык - это язык всех строк, которые содержат хотя бы один b.Чтобы убедиться, что это правильный язык, рассмотрим NFA.

  • любая строка с хотя бы одним b должна иметь последнее вхождение b, после чего строка не содержит ничего, кроме a (или вообще ничего)), если строка заканчивается буквой b.
  • , любая строка может быть использована до этой точки путем зацикливания на состоянии q0 в NFA
  • , тогда переход эпсилон / лямбда может быть принят к q1
  • затем последний b в строке может быть использован для перехода к q4
  • с этой точки, все остальные a (если есть) могут быть использованы
  • хотя бы одинb должно быть использовано для достижения q4 от q1 или до q2 для перехода к q3.

Этот DFA не является минимальным, для этого языка существует DFA с двумя состояниями:

 Q | s | Q'
===|===|===
 X | a | X
 X | b | Y
 Y | a | Y
 Y | b | Y

Если X - начальное состояние, а Y - принимающее состояние, это принимает тот же язык.

...