Эквивалентность состояний ДКА — различия между версиями
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>
Замечание: в данной реализации оба автомата обязательно должны иметь дьявольские состояния.