Эквивалентность состояний ДКА — различия между версиями
(→Проверка через BFS) |
(→Проверка через BFS) |
||
Строка 51: | Строка 51: | ||
Псевдокод: | Псевдокод: | ||
<font color=green>// <tex>Q</tex> {{---}} очередь из пар состояний</font> | <font color=green>// <tex>Q</tex> {{---}} очередь из пар состояний</font> | ||
− | '''function''' $\mathtt{bfsEquivalenceCheck}$($aut1$, $aut2$) | + | ''boolean'' '''function''' $\mathtt{bfsEquivalenceCheck}$($aut1$, $aut2$) |
$\mathtt{insert} \langle s_1, s_2 \rangle in Q $ | $\mathtt{insert} \langle s_1, s_2 \rangle in Q $ | ||
$\mathtt{used1[0]} \leftarrow $ ''true'' | $\mathtt{used1[0]} \leftarrow $ ''true'' |
Версия 14:43, 18 октября 2014
Содержание
Основные определения
Определение: |
Два автомата | и называются эквивалентными (англ. equivalent), если они распознают один и тот же язык над алфавитом , то есть .
Определение: |
Слово различает (англ. distinguish) два состояния и , если
|
Определение: |
Два состояния строки, которая их различает, то есть верно, что
| и называются эквивалентными , если не существует
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как (равносильность) является отношением эквивалентности и в детерминированном автомате всегда существует путь по любому слову, описанное нами отношение является отношением эквивалентности.
Лемма: |
, , , различает и . Тогда различает и . |
Доказательство: |
А значит, по условию различимости для и , |
Пример
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита
. Стартовые и все допускающие состояния автоматов эквивалентны между собой.Проверка ДКА на эквивалентность
Заданы два автомата:
со стартовым состоянием и со стартовым состоянием соответственно. Нужно проверить их на эквивалентность.Проверка через минимизацию
Для этого построим автомат
Осталось лишь проверить на эквивалентность состояния и в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов и . Для этого можно применить алгоритм минимизации ДКА, который разбивает все состояния на классы эквивалентности. Если состояния и нового автомата в одном классе эквивалентности — исходные автоматы эквивалентны.
Также можно минимизировать каждый автомат отдельно и проверить минимизированные версии на изоморфизм.
Замечание: для реализации оба автомата обязательно должны иметь дьявольские состояния.
Проверка через BFS
Алгоритм заключается в синхронном обходе автоматов в ширину, проверяя, что по пути сохраняются терминальные состояния. Поскольку эквивалентные автоматы допускают один тот же язык, при переходе по одним и тем же символам в обоих автоматах, слово должно приниматься обоими автоматами одновременно. То есть вершины, в которые мы перешли, должны быть либо одновременно терминальными, либо одновременно нетерминальными, что и проверяет приведённый алгоритм.
<wikitex> Псевдокод:
//
— очередь из пар состояний
boolean function $\mathtt{bfsEquivalenceCheck}$($aut1$, $aut2$)
$\mathtt{insert} \langle s_1, s_2 \rangle in Q $
$\mathtt{used1[0]} \leftarrow $ true
$\mathtt{used2[0]} \leftarrow $ true
while $Q \ne \varnothing $
$u \leftarrow Q.front.first$
$v \leftarrow Q.front.second$
$\mathtt{pop(Q)}$
if( $\mathtt{isTerminal1[u]} \ne \mathtt{isTerminal2[v]}$ )
return false
for $i \in \Sigma$
if( not $\mathtt{used1[aut1[u][i]]}$ || not $\mathtt{used2[aut2[v][i]]} $)
insert $ \langle \mathtt{aut1[u][i]}, \mathtt{aut2[v][i]} \rangle \in Q $
$\mathtt{used1[aut1[u][i]]} \leftarrow $ true
$\mathtt{used2[aut2[v][i]]} \leftarrow $ true
return true;
</wikitex>
Замечание: в данной реализации оба автомата обязательно должны иметь дьявольские состояния.