Минимизация конечного автомата
Учитывая, что мы можем определять эквивалентные автоматы, хотелось бы научиться находить наименьший среди них. Задача нахождения наименьшего конечного автомата, распознающего данный язык, также разрешима, причем тоже конструктивным образом. Для описания процесса нахождения наименьшего конечного автомата, введем следующее определение.
Определение. Строка w различает состояния s и t, если существует такая входная цепочка w, что d(s,w) является заключительным состоянием, а состояние d(t,w) не является заключительным состоянием, или, наоборот, d(s,w) не является заключительным состоянием, а состояние d(t,w) является заключительным состоянием.
Очевидно, что если некоторая строка w различает состояния t1 и t2 такие, что t1=d(qi,a) и t2=d(q2,а), то строка aw различает состояния q1 и q2.
Теперь перейдём к описанию процесса минимизации конечного автомата.
1. Мы начнём с поиска и удаления всех недостижимых состояний.
2. Затем мы должны найти такое разбиение множества состояний автомата, чтобы каждое подмножество содержало неразличимые состояния, т.е. если s и t принадлежат некоторому подмножеству, то для всех a из S d(s,a) и d(t,a) также принадлежат этому подмножеству. Для этого мы разобьём множество состояний на два подмножества: F и S-F.
3. В дальнейшем, мы попытаемся разбить каждое из подмножеств, соблюдая указанное выше условие. Если возникает ситуация, при которой мы не можем разбить никакое множество состояний, то мы заканчиваем процесс разбиения.
4. В результате мы получим некоторый набор множеств состояний S1…Sk. Каждое из Si содержит только неразличимые состояния.
5. Наконец, внесём в множество состояний минимизированного автомата по одному представителю каждого из множеств Si. На этом процесс завершается.
Далее мы приведём пример минимизации автомата.
Пример минимизации конечного автомата
Рассмотрим процесс минимизации автомата, представленного на слайде. Согласно алгоритму, вначале мы произведем удаление недостижимых состояний – в нашем примере состояние F очевидно недостижимо и потому не попадет в минимизированный автомат.
Затем мы произведем разбиение множества состояний автомата на классы эквивалентности. Укажем такую последовательность разбиений:
1,E, ABCD
2, E, ABC, D, т.к. есть переход в Е
3, E, AC, B, D, т.к. есть переход в D
Таким образом, состояния A и C неразличимы. Поэтому получаем следующий автомат:
Алгоритм минимизации детерминированного конечного автомата
(эквивалентный начальному)
1, Находим и удаляем из начального автомата все недостижимые и непродуктивные состояния.
2, Все состояния конечного автомата разделяются на классы эквивалентности (0).
1. Все состояния, которые являются конечными в автомате (qi in F)
2. Все состояния, не вошедшие в F
3, Строим новое одно эквивалентное разбиение, выделив те состояния, которые по одинаковым символам переходят в 0 эквивалентные.
4, Повторяется шаг 3, последовательно создавая n+1 эквивалентное состояние по n эквивалентным, увеличивая так число классов эквивалентности.
5, Алгоритм заканчивается, когда n+1 эквивалентные состояния совпадают с n эквивалентными.
Каждый полученный класс эквивалентности будет новым состоянием в новом минимизированном автомате.
В множество F' автомата внесём те состояния, которые содержат хотя бы одно состояние из начального.
Пример.
Задан избыточный детерминированный KA=(S,Q,Q0,d,F)
S={0,1}
Q={A,B,C,D,E,F,G}
F={D,E}
d: (d)
d(A,0)={B}
d(A,1={C}
d(B,1)={D}
d(D,1)={E}
d(E,1)={D}
d(D,0)={C}
d(E,0)={B}
d(C,1)={E}
d(G,1)={E}
d(G,0)={F}
d(F,0)={G}
d(F,1)={D}
Минимизация.
Первый шаг. Удаляем недоститжимые и непродуктивные состояния. В состояния F и G нельзя попасть, в них нет стрелок – они недостижимые.
Строим 0 эквивалентные:
0-> (D,E), остальные → A, B, C
1-> (DE)(BC)(A) — из них можно попасть через один и тот же символ в (D,E)
2->(DE)(BC)(A)
Алгоритм завершён.
Строим новый автомат с состояниями (DE)(BC)(A)
Пример. Задан избыточный детерминированный .
S={0,1,2}
Q={q0,q1,q2,q3,q4,q5,q6,q7,q8}
F={q6,q7}
d: (d)
d(q0,1)={q0}
d(q0,0={q1}
d(q1,1)=q2
d(q1,0)=q4
d(q2,1)=q3
d(q3,1)=q1
d(q2,0)=q4
d(q3,0)=q4
d(q3,2)=q8
d(q4,1)=q5
d(q4,0)=q6
d(q5,1)=q4
d(q5,0)=q6
d(q6,1)=q6
q(q6,0)=q7
d(q7,0)=q7
d(q7,1)=q6
d(q8,1)=q8
Сразу удаляем q8 – непродуктивный
0 → (q6,q7)(q0,q1,q2,q3,q4,q5)
1→ (q6,q7)(q4,q5)(q0,q1,q2,q3) из q4,q5 можно по 0 попасть в нулевой класс
2→ (q6,q7)(q4,q5)(q1,q2,q3)(q0)
3→ (q6,q7)(q4,q5)(q1,q2,q3)(q0)
Пример.
Результирующий автомат строится на основе первого, соединяя эквивалентные состояния в одно, внутренние переходы отображаются в виде петель.
Пример.
Q={0,1,3,4}
F={1,2}
d(0,a)=1
d(1,a)=3
d(1,b)=2
0→ (q1,q2),(q0)
Удаляем q5 и q4, как непродуктивные состояния
После чего по алгоритму объединяем состояния
I (q0q2)(q1q3)
II (q0q2)(q1q3)
Строим минимальный автомат.