Сначала я отвечу на вопрос по-своему. Затем я расскажу о вашем преобразовании в детерминированный конечный автомат.
Мы можем написать набор уравнений и решить для q2, чтобы увидеть, что регулярное выражение приводит к этому состоянию. Рассмотрим следующую систему:
(q1) = (q2)a + e
(q2) = (q1) + (q3)(a + b)
(q3) = (q1)a + (q3)b
Мы хотим выяснить, что приводит к принимающему состоянию, поэтому давайте сначала удалим неприемлемые:
(q1) = (q2)a + e
(q2) = (q2)a + e + (q3)(a + b)
(q3) = (q2)aa + a + (q3)b
Чтобы исключить (q3), мы можем использовать правило (x) = r + (x) s <=> (x) = rs * и затем заменить:
(q1) = (q2)a + e
(q3) = ((q2)aa + e)b*
(q2) = (q2)a + e + ((q2)aa + a)b*(a + b)
= (q2)a + e + (q2)aab*(a + b) + ab*(a + b)
= (q2)[a + aab*(a + b)] + [e + ab*(a + b)]
= (e + ab*(a + b))(a + aab*(a + b))*
= (e + ab*(a + b))(a(e + ab*(a + b)))*
Регулярное выражение, которое мы восстанавливаем, в основном описывает это:
Доберитесь до q2, либо взяв пустой переход, либо пройдя через q3; затем вернитесь к q2, перейдя к q1 и повторив первую часть. Вы можете делать это столько раз, сколько захотите.
Как вы пишете систему?
- Начальное состояние может быть достигнуто с помощью
- если в выражении r происходит переход из состояния q в состояние q ', то q' = (q) r
- если состояние может быть достигнуто несколькими способами, используйте + и включите все способы
Чтобы определить конечный автомат, рассмотрите каждое подмножество состояний и добавляйте переходы по мере продвижения. Начнем с подмножества {q1}, состоящего только из начального состояния.
/------------------------------------\
| __ |
V / \ |
{q1} -a-> {q1,q3} -a-> {q1,q2,q3} a |
| | | ^__/ |
b b b |
| __ | | |
V / V V | |
{ } b {q2,q3} <--------/ |
^ \__/ \ |
| \-a->{q1,q2}-----a----/
| |
\----------b----------/
Правила добавления состояний и переходов:
- Всегда добавлять начальное состояние {qi}
- Для каждого состояния {q1, q2, ..., qn} и каждого символа x во входном алфавите добавьте переход от {q1, q2, ..., qn} к {q1 ', q2' ,. .., qn '} на x, где q1', q2 ',…, qn' достижимы из q1, q2,…, qn, потребляя ровно один x (и, возможно, несколько электронных переходов)
- Если состояния {q1 ', q2', ..., qn '} еще нет в вашем автомате, добавьте его и повторите этот процесс для этого состояния
- Повторяйте выше, пока все необходимые состояния не будут добавлены и все состояния имеют переходы для каждого символа во входном алфавите.
Примечание: в приведенном выше автомате я не показывал переходы в мертвом состоянии {}. Все переходы, происходящие в мертвом состоянии, заканчиваются в мертвом состоянии.
Мой {q1} аналогичен вашему верху (ОК). Мой {} аналогичен вашей дыре. Мой {q1, q3} аналогичен вашему НЕ. Мой {q2, q3} аналогичен вашему правому ок.
Однако - мои {q1, q2, q3} НЕ аналогичны вашему нижнему ОК. Чтобы сделать свой, как мой, добавьте переход от самого нижнего OK к крайнему правому OK на символе b.
Обратите внимание, что my {q1, q2} избыточен и эквивалентен моему {q1}; все переходы из {q1, q2} такие же, как и из {q1}. На самом деле, из-за электронного перехода от q1 к q2 я должен был сделать {q1, q2} начальным состоянием, но как бы то ни было - вы поняли.
Причина, по которой ваше DFA не может быть правильным, заключается в том, что в NFA всегда есть шанс «взорвать его» и оказаться в дыре. В вашем автомате вы можете добраться до самого нижнего ОК и затем установить.