Эквивалентность состояний ДКА — различия между версиями
(→Проверка через минимизацию) |
(→Проверка через минимизацию) |
||
| Строка 39: | Строка 39: | ||
[[Файл:auto_equiq.png|470px]]<br> | [[Файл:auto_equiq.png|470px]]<br> | ||
Осталось лишь проверить на эквивалентность состояния <tex> s_1 </tex> и <tex> s_2 </tex> в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов <tex> \mathcal{A}_1 </tex> и <tex> \mathcal{A}_2 </tex>. Для этого можно применить [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|алгоритм минимизации ДКА]], который разбивает все состояния на классы эквивалентности. Если состояния <tex>s_1</tex> и <tex>s_2</tex> нового автомата в одном классе эквивалентности {{---}} исходные автоматы эквивалентны. | Осталось лишь проверить на эквивалентность состояния <tex> s_1 </tex> и <tex> s_2 </tex> в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов <tex> \mathcal{A}_1 </tex> и <tex> \mathcal{A}_2 </tex>. Для этого можно применить [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|алгоритм минимизации ДКА]], который разбивает все состояния на классы эквивалентности. Если состояния <tex>s_1</tex> и <tex>s_2</tex> нового автомата в одном классе эквивалентности {{---}} исходные автоматы эквивалентны. | ||
| + | |||
| + | Также можно минимизировать каждый автомат отдельно и проверить минимизированные версии на изоморфизм. | ||
| + | |||
Замечание: для реализации оба автомата обязательно должны иметь [[Детерминированные_конечные_автоматы#допускает|дьявольские состояния]]. | Замечание: для реализации оба автомата обязательно должны иметь [[Детерминированные_конечные_автоматы#допускает|дьявольские состояния]]. | ||
Версия 13:55, 18 октября 2014
Содержание
Основные определения
| Определение: |
| Два автомата и называются эквивалентными (англ. equivalent), если они распознают один и тот же язык над алфавитом , то есть . |
| Определение: |
Слово различает (англ. distinguish) два состояния и , если
|
| Определение: |
Два состояния и называются эквивалентными , если не существует строки, которая их различает, то есть верно, что
|
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как (равносильность) является отношением эквивалентности и в детерминированном автомате всегда существует путь по любому слову, описанное нами отношение является отношением эквивалентности.
| Лемма: |
, , , различает и . Тогда различает и . |
| Доказательство: |
|
А значит, по условию различимости для и , |
Пример
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита . Стартовые и все допускающие состояния автоматов эквивалентны между собой.
Проверка ДКА на эквивалентность
Заданы два автомата: со стартовым состоянием и со стартовым состоянием соответственно. Нужно проверить их на эквивалентность.
Проверка через минимизацию
Для этого построим автомат , содержащий все состояния обоих автоматов и изначальные переходы между ними. Стартовым состоянием в новом автомате можно сделать или — это не имеет значения. При этом состояния одного из автоматов станут недостижимыми из новый стартовой вершины в новом автомате, но для алгоритма это и не важно.
![]()
Осталось лишь проверить на эквивалентность состояния и в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов и . Для этого можно применить алгоритм минимизации ДКА, который разбивает все состояния на классы эквивалентности. Если состояния и нового автомата в одном классе эквивалентности — исходные автоматы эквивалентны.
Также можно минимизировать каждый автомат отдельно и проверить минимизированные версии на изоморфизм.
Замечание: для реализации оба автомата обязательно должны иметь дьявольские состояния.
Проверка через BFS
Алгоритм заключается в синхронном обходе автоматов в ширину, проверяя, что по пути сохраняются терминальные состояния.
Псевдокод:
bfs_equivalence_check(aut1, aut2)
insert in
used1[0] true;
used2[0] true;
while
u Q.front.first;
v Q.front.second;
pop(Q);
if(isTerminal1[u] != isTerminal2[v])
return false;
for
if(!used1[aut1[u][i]] || !used2[aut2[v][i]])
insert aut1[u][i], aut2[v][i] in
used1[aut1[u][i]] true;
used2[aut2[v][i]] true;
return true;
Замечание: в данной реализации оба автомата обязательно должны иметь дьявольские состояния.
См. также