Эквивалентность состояний ДКА — различия между версиями
(→Проверка через BFS) |
Shersh (обсуждение | вклад) (→Основные определения) |
||
Строка 1: | Строка 1: | ||
− | == | + | == Связь эквивалентности состояний и различимости состояний == |
{{Определение | {{Определение |
Версия 20:19, 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>
Замечание: в данной реализации оба автомата обязательно должны иметь дьявольские состояния.
<wikitex> Доказательство корректности: Пусть по строке $w$ мы пришли в состояния $ \langle u, v \rangle $, и пусть они нетерминальные. Пусть мы перешли по символу $c$ в состояние $ \langle u', v' \rangle $ ($u$ может быть равно $u'$ или $v'$ может быть равно $u'$, но не оба сразу). Тогда если $\mathtt{isTerminal1[u]} \ne \mathtt{isTerminal2[v]}$, то строка $wc$ различает эти два состояния. А значит автоматы не эквивалентны. </wikitex>