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