Изменения

Перейти к: навигация, поиск

Эквивалентность состояний ДКА

2741 байт добавлено, 02:09, 24 мая 2021
м
Нет описания правки
== Связь эквивалентности состояний и различимости состояний ==
 
{{Определение
|definition = Два автомата <tex> \mathcal{A}_1 = \langle Q_1,\Sigma,\delta_1,s_{1}, T_1\subseteq Q_1 \rangle </tex> и <tex>\mathcal{A}_2 = \langle Q_2,\Sigma,\delta_2,s_{2}, T_2\subseteq Q_2 \rangle </tex> называются '''эквивалентными'''(англ. ''equivalent''), если они распознают один и тот же язык над алфавитом <tex>\Sigma</tex>, то есть <tex>\mathcal{L}(\mathcal{A}_1) = \mathcal{L}(\mathcal{A}_2)</tex>.
}}
{{Определение
|definition = [[Основные определения, связанные со строками#string|Слово]] <tex>z \in \Sigma^*</tex> '''различает''' (англ. ''distinguish'') два состояния <tex>q_i</tex> и <tex>q_j</tex>, если
* <tex> \langle q_i, z \rangle \vdash^* \langle t_1, \varepsilon \rangle, \langle q_j, z \rangle \vdash^* \langle t_2, \varepsilon \rangle \Rightarrow (t_1 \notin T \Leftrightarrow t_2 \in T) </tex>.
}}
== Проверка ДКА на эквивалентность ==
Заданы два автомата: <tex> \mathcal{A}_1 </tex> со стартовым состоянием <tex> s_1 </tex> и <tex> \mathcal{A}_2 </tex> со стартовым состоянием <tex> s_2 </tex> соответственно. Нужно проверить их на эквивалентность.
 
'''Замечание:''' для реализации оба автомата обязательно должны иметь [[Детерминированные_конечные_автоматы#допускает|дьявольские состояния]].
=== Проверка через минимизацию ===
Для этого построим автомат <tex> \mathcal{A} </tex>, содержащий все состояния обоих автоматов и изначальные переходы между ними. Стартовым состоянием в новом автомате можно сделать <tex> s_1 </tex> или <tex> s_2 </tex> — это не имеет значения. (При этом состояния одного из автоматов станут недостижимыми из новый новой стартовой вершины в новом автомате, но для алгоритма это и не важно.)<br>
[[Файл:auto_equiq.png|470px]]<br>
Осталось лишь проверить на эквивалентность состояния <tex> s_1 </tex> и <tex> s_2 </tex> в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов <tex> \mathcal{A}_1 </tex> и <tex> \mathcal{A}_2 </tex>. Для этого можно применить [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|алгоритм минимизации ДКА]], который разбивает все состояния на классы эквивалентности. Если состояния <tex>s_1</tex> и <tex>s_2</tex> нового автомата в одном классе эквивалентности {{- --}} исходные автоматы эквивалентны. Также можно минимизировать каждый автомат отдельно и проверить минимизированные версии на изоморфизм.
=== Проверка через BFS ===
Алгоритм заключается Два автомата можно также проверить на эквивалентность, используя [[Обход в синхронном обходе автоматов ширину | обход в ширину]]. Будем синхронно обходить два автомата, проверяяначиная со стартовых состояний, что по пути сохраняются терминальные в поисках такой строки, которая различает два состоянияэтих автоматов. То есть она будет допускаться одним автоматом, но не будет принадлежать языку другого.
Поскольку эквивалентные автоматы допускают один и тот же язык, при переходе по одним и тем же символам в обоих автоматах, слово должно приниматься обоими автоматами одновременно. То есть вершины, в которые мы перешли, должны быть либо одновременно терминальными, либо одновременно нетерминальными, что и проверяет приведённый алгоритм. ==== Псевдокод:==== <font color=green>// $\mathtt{aut}[i][c]$ {{---}} номер состояния, в которое есть переход из состояния $i$ по символу $c$</font> bfs_equivalence_check'''boolean''' $\mathtt{bfsEquivalenceCheck}$($\mathtt{aut1}$ : '''int[][]''', $\mathtt{aut2}$ : '''int[][]'''): queue$Q.\mathtt{push}( <0\langle s_1, 0> s_2 \rangle); used1[0] $ <font color= used2[0] = true;green>// <tex> Q </tex> {{---}} очередь из пар состояний</font> '''while( !q.isEmpty() )''' $Q \ne \varnothing $ $u = q.front.first; , v = q.front.second; q\leftarrow Q.\mathtt{pop}();$ '''if(''' $\mathtt{isTerminal1[u] != } \ne \mathtt{isTerminal2[v])}$ '''return ''' ''false;'' $\mathtt{used[u][v]} \leftarrow $ ''true'' '''for(i = a..z)''' $c \in \Sigma$ '''if(!used1''' '''not''' $\mathtt{used[automata1aut1[u][ic]] || !used2[automata2aut2[v][ic]])}$ q$Q.\mathtt{push}( <automata1\langle \mathtt{aut1}[u][ic], automata2\mathtt{aut2}[v][ic]> \rangle); used1[automata1[u][i]] = used2[automata2[v][i]] = true;$ '''return ''' ''true;''
Замечание: в данной реализации оба автомата обязательно должны иметь [[Детерминированные_конечные_автоматы#допускает|дьявольские Корректность алгоритма следует из строго доказательства того факта, что если два состояния]]$u$ и $v$ различаются какой-то строкой, то они различаются строкой длины $O(n)$.
== Источники информации ==Интуитивное понимание алгоритма такое: пусть по строке $w$ мы пришли в состояния $ \langle u, v \rangle $, и пусть они оба нетерминальные. После этого совершим переход по символу $c$ в состояния $ \langle u', v' \rangle $.  Тогда если $\mathtt{isTerminal1[u']} \ne \mathtt{isTerminal2[http://stackoverflowv']}$, то строка $wc$ различает эти два состояния. А значит автоматы не эквивалентны.com/questions/6905043/equivalence-between-two-automata/12623361#12623361| equivalence between two automata]
== См. также ==
* [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|Алгоритм минимизации ДКА]]* [[Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n))]] == Источники информации ==* [http://stackoverflow.com/questions/6905043/equivalence-between-two-automata/12623361#12623361 StackOverflow {{---}} Equivalence between two automata]
12
правок

Навигация