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