Изменения

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

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

2565 байт добавлено, 19:33, 4 сентября 2022
м
rollbackEdits.php mass rollback
== Связь эквивалентности состояний и различимости состояний ==
 
{{Определение
|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> называются <em>'''эквивалентными</em>''' (англ. ''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>.
}}
{{Определение
|definition = Два <em> состояния</em> <tex>q_i</tex> и <tex>q_j</tex> называются <em>'''эквивалентными</em> ''' <tex>(q_i \sim q_j)</tex>, если не существует [[Основные определения, связанные со строками#string|строки]], которая их различает, то есть <tex>\forall z\in \Sigma^*</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 \in T \Leftrightarrow t_2 \in T ) </tex>.
}}
== Пример ==
[[Файл:avtomat2.png|350px]] [[Файл:avtomat3.png|350px]]
 
Эти два автомата принимают слова из языка слов длины не меньше двух состоящих из символов алфавита <tex> \lbrace 0, 1\rbrace </tex>. Все допускающие состояния автоматов эквивалентны между собой.
 
== Алгоритм проверки эквивалентности автоматов ==
'''Задано''': Два детерминированных конечных автомата Заметим, что эквивалентность состояний действительно является [[Отношение эквивалентности|отношением эквивалентности]]. Так как <tex> \mathcal{A}_1 = \langle Q_1,\Sigma,\delta_1,s_{1}, T_1\subseteq Q_1 \rangle Leftrightarrow </tex> (равносильность) является отношением эквивалентности и <tex>\mathcal{A}_2 = \langle Q_2,\Sigma,\delta_2,s_{2}в детерминированном автомате всегда существует путь по любому слову, T_2\subseteq Q_2 \rangle </tex> <br>'''Необходимо определить''': Эквивалентны ли эти автоматы <br>описанное нами отношение является отношением эквивалентности.
{{Лемма
|statement =
<tex> \mathcal{A} = \langle Q, \Sigma, \delta, s, T \rangle </tex>* , <tex> p_1, p_2, q_1, q_2 \in Q </tex>* , <tex> q_i = \delta(p_i, c) </tex>* , <tex> w \in \Sigma^*</tex> различает <tex> q_1 </tex> и <tex> q_2 \Rightarrow </tex>. Тогда <tex>cw </tex> различает <tex> p_1 </tex> и <tex> p_2 </tex>.
|proof =
<tex> \langle p_i, cw \rangle \vdash \langle q_i, w \rangle \vdash^* \langle t_i, \varepsilon \rangle </tex>
А значит, по условию различимости для <tex> q_1 </tex> и <tex> q_2</tex> , <tex> t_1 \in T \Leftrightarrow t_2 \notin T </tex>
}}
<br>
Рассмотрим такие семейства множеств:
* <tex> D_i = \lbrace \langle q, p\rangle | q \in Q_1, p \in Q_2, \exists w : |w| \le i, w </tex> различает <tex> q </tex> и <tex> p \rbrace </tex>
* <tex> E_i = D_i \setminus D_{i - 1} </tex>
Для <tex> D_i </tex> существует рекуррентная формула=== Пример ===[[Файл:avtomat2.png|200px]] [[Файл:avtomat3.png|200px]]* Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита <tex> D_i = D_{i - 1} \cup \lbrace \langle p, q \rangle | \exists c \in \Sigma : \langle \delta(p, c)0, \delta(q, c) \rangle \in E_{i - 1} \rbrace </tex>То есть <tex> D_i </tex> {{---}} объединение множества всех пар состояний, которые различаются строками длины, меньшей <tex> i </tex>, с множеством всех пар состояний, которые различаются строками длины ровно <tex> i </tex>. Стартовые и все допускающие состояния автоматов эквивалентны между собой.
Заметим, что <tex> \exists k [[Категория: E_k = \varnothing </tex>, причем <tex> k \le |Q| ^ 2</tex>. И еще заметим, что <tex> E_k = \varnothing \Rightarrow E_{k + 1} = \varnothing </tex>, так как в <tex> D_{k+1}</tex> новых элементов не добавится, поэтому <tex> D_{k+1} = D_k </tex>.Теория формальных языков]]Значит[[Категория:* <tex> E_k = \varnothing \Rightarrow D_k = \lbrace \langle q, p\rangle | q \in Q_1, p \in Q_2, \exists w : w </tex> различает <tex> q </tex> Автоматы и <tex> p \rbrace = \lbrace \langle q, p\rangle | (q \nsim p)\rbrace</tex>регулярные языки]]
Осталось найти такое == Проверка ДКА на эквивалентность ==Заданы два автомата: <tex> k \mathcal{A}_1 </tex> и со стартовым состоянием <tex> D_k s_1 </tex>, что и <tex> E_k = \varnothing mathcal{A}_2 </tex> тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что со стартовым состоянием <tex> \langle s_1, s_2 \rangle \notin D_k </tex>, тогда автоматы будут эквивалентнысоответственно. Нужно проверить их на эквивалентность.
Будем строить '''Замечание:''' для реализации оба автомата обязательно должны иметь [[Детерминированные_конечные_автоматы#допускает|дьявольские состояния]].=== Проверка через минимизацию ===Для этого построим автомат <tex> D_i \mathcal{A} </tex> , содержащий все состояния обоих автоматов и изначальные переходы между ними. Стартовым состоянием в порядке увеличения новом автомате можно сделать <tex> i s_1 </tex>, пока или <tex> D_i \neq D_{i - 1}s_2 </tex>— это не имеет значения.При этом состояния одного из автоматов станут недостижимыми из новой стартовой вершины в новом автомате, но для алгоритма это и не важно.<br>[[Файл:auto_equiq.png|470px]]<br>Заметим, что Осталось лишь проверить на эквивалентность состояния <tex> s_1 </tex> и <tex> D_0 = \lbrace \langle p, q\rangle | p \in T_1 \Leftrightarrow q \notin T_2 \rbrace s_2 </tex>, так как строка длины 0 одна в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов <tex> \mathcal{{---A}} это _1 </tex> и <tex> \varepsilon mathcal{A}_2 </tex>. Для этого можно применить [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|алгоритм минимизации ДКА]], а который разбивает все состояния на классы эквивалентности. Если состояния <tex> \varepsilon s_1</tex> различает только пары состоящие из одного терминального состояния и одного нетерминального<tex>s_2</tex> нового автомата в одном классе эквивалентности {{---}} исходные автоматы эквивалентны.
Дальше будем получать <tex> D_i </tex> по рекуррентной формуле, пока не выполнится условие остановкиТакже можно минимизировать каждый автомат отдельно и проверить минимизированные версии на изоморфизм.
Это === Проверка через BFS ===Два автомата можно реализовать проще: будем хранить для каждого состояниятакже проверить на эквивалентность, из какого состояния есть переход по символу <tex> c </tex> используя [[Обход в ширину | обход в наше. В очередь будем класть пары неэквивалентных состоянийширину]]. Дальше вытаскивая из очереди паруБудем синхронно обходить два автомата, рассмотрим все пары начиная со стартовых состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь. Псевдокод:<font size = 3> <tex> q = \varnothing </tex> fill(neqпоисках такой строки, false) for <tex> p_1 \in Q_1 </tex>: for <tex> p_2 \in Q_2 </tex>: if <tex> (p_1 \in T_1) \neq (p_2 \in T_2) </tex>: qкоторая различает два состояния этих автоматов.push(<tex>p_1</tex>,<tex> p_2</tex>) neq[<tex>p_1</tex>, <tex>p_2</tex>] = True; while not isEmpty(q): <tex> \langle p_1, p_2 \rangle </tex> = q.pop() for <tex> c \in \Sigma </tex> : for <tex> \delta(e_1, c) = p_1 </tex>: for <tex> \delta(e_2То есть она будет допускаться одним автоматом, c) = p_2 </tex>: qно не будет принадлежать языку другого.push(<tex>e_1</tex>, <tex>e_2</tex>) neq[<tex>e_1</tex>, <tex>e_2</tex>] = True if neq[<tex>s_1</tex>, <tex>s_2</tex>]: print("Not equivalent") else print("Equivalent")</font>
Алгоритм будет работать за Поскольку эквивалентные автоматы допускают один и тот же язык, при переходе по одним и тем же символам в обоих автоматах, слово должно приниматься обоими автоматами одновременно. То есть вершины, в которые мы перешли, должны быть либо одновременно терминальными, либо одновременно нетерминальными, что и проверяет приведённый алгоритм. ==== Псевдокод ==== <font color=green>// $\mathtt{aut}[i][c]$ {{---}} номер состояния, в которое есть переход из состояния $i$ по символу $c$<tex/font> '''boolean''' $\mathtt{bfsEquivalenceCheck}$($\mathtt{aut1}$ : '''int[][]''', $\mathtt{aut2}$ : '''int[][]'''): $Q.\mathcal Omathtt{push}(|Q_1||Q_2||\Sigma|^2langle s_1, s_2 \rangle)$ <font color=green>// <tex> Q </tex>{{---}} очередь из пар состояний</font> '''while''' $Q \ne \varnothing $ $u, v \leftarrow Q.\mathtt{pop}()$ '''if''' $\mathtt{isTerminal1[u]} \ne \mathtt{isTerminal2[v]}$ '''return''' ''false'' $\mathtt{used[u][v]} \leftarrow $ ''true'' '''for''' $c \in \Sigma$ '''if''' '''not''' $\mathtt{used[aut1[u][c]][aut2[v][c]]}$ $Q.\mathtt{push}(\langle \mathtt{aut1}[u][c], \mathtt{aut2}[Категорияv][c] \rangle)$ '''return''' ''true'' Корректность алгоритма следует из строго доказательства того факта, что если два состояния $u$ и $v$ различаются какой-то строкой, то они различаются строкой длины $O(n)$. Интуитивное понимание алгоритма такое: Теория формальных языковпусть по строке $w$ мы пришли в состояния $ \langle u, v \rangle $, и пусть они оба нетерминальные. После этого совершим переход по символу $c$ в состояния $ \langle u', v' \rangle $.  Тогда если $\mathtt{isTerminal1[u']} \ne \mathtt{isTerminal2[v']}$, то строка $wc$ различает эти два состояния. А значит автоматы не эквивалентны. == См. также == * [[Минимизация_ДКА,_алгоритм_за_O(n%5E2)_с_построением_пар_различимых_состояний|Алгоритм минимизации ДКА]]* [[Минимизация ДКА, алгоритм Хопкрофта (сложность O(n log n))]] == Источники информации ==* [http://stackoverflow.com/questions/6905043/equivalence-between-two-automata/12623361#12623361 StackOverflow {{---}} Equivalence between two automata]
1632
правки

Навигация