Эквивалентность состояний ДКА — различия между версиями
(→Алгоритм проверки эквивалентности автоматов) |
|||
Строка 19: | Строка 19: | ||
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита <tex> \lbrace 0, 1\rbrace </tex>. Все допускающие состояния автоматов эквивалентны между собой. | Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита <tex> \lbrace 0, 1\rbrace </tex>. Все допускающие состояния автоматов эквивалентны между собой. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
{{Лемма | {{Лемма | ||
|statement = | |statement = | ||
− | <tex> \mathcal{A} = \langle Q, \Sigma, \delta, s, T \rangle </tex> | + | <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 </tex>. Тогда <tex>cw</tex> различает <tex> p_1 </tex> и <tex> p_2 </tex>. |
− | |||
− | |||
− | |||
|proof = | |proof = | ||
<tex> \langle p_i, cw \rangle \vdash \langle q_i, w \rangle \vdash^* \langle t_i, \varepsilon \rangle </tex> | <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> | А значит, по условию различимости для <tex> q_1 </tex> и <tex> q_2</tex> , <tex> t_1 \in T \Leftrightarrow t_2 \notin T </tex> | ||
}} | }} | ||
+ | |||
+ | == Алгоритм проверки эквивалентности автоматов == | ||
+ | ===Постановка задачи=== | ||
+ | Даны два детерминированных конечных автомата <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>. Требуется определить, эквивалентны ли они. | ||
===Алгоритм=== | ===Алгоритм=== | ||
Рассмотрим такие семейства множеств: | Рассмотрим такие семейства множеств: | ||
− | * <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> 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> E_i = D_i \setminus D_{i - 1} </tex>. |
Для <tex> D_i </tex> существует рекуррентная формула: | Для <tex> D_i </tex> существует рекуррентная формула: | ||
− | * <tex> D_i = D_{i - 1} \cup \lbrace \langle p, q \rangle | \exists c \in \Sigma : \langle \delta(p, c), \delta(q, c) \rangle \in E_{i - 1} \rbrace </tex> | + | * <tex> D_i = D_{i - 1} \cup \lbrace \langle p, q \rangle | \exists c \in \Sigma : \langle \delta(p, c), \delta(q, c) \rangle \in E_{i - 1} \rbrace </tex>. |
− | То есть <tex> D_i </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> \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> 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 </tex> и <tex> D_k </tex>, что <tex> E_k = \varnothing </tex> тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что <tex> \langle s_1, s_2 \rangle \notin D_k </tex>, тогда автоматы будут эквивалентны. | Осталось найти такое <tex> k </tex> и <tex> D_k </tex>, что <tex> E_k = \varnothing </tex> тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что <tex> \langle s_1, s_2 \rangle \notin D_k </tex>, тогда автоматы будут эквивалентны. |
Версия 06:15, 8 января 2012
Определение: |
Два автомата | и называются эквивалентными, если они распознают один и тот же язык над алфавитом , то есть .
Определение: |
Слово
| различает два состояния и , если
Определение: |
Два состояния
| и называются эквивалентными , если не существует строки, которая их различает, то есть верно, что
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как является отношением эквивалентности, и , что и доказывает, что описанное нами отношение является отношением эквивалентности.
Содержание
Пример
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита
. Все допускающие состояния автоматов эквивалентны между собой.Лемма: |
, , , различает и . Тогда различает и . |
Доказательство: |
А значит, по условию различимости для и , |
Алгоритм проверки эквивалентности автоматов
Постановка задачи
Даны два детерминированных конечных автомата
и . Требуется определить, эквивалентны ли они.Алгоритм
Рассмотрим такие семейства множеств:
- различает и ;
- .
Для
существует рекуррентная формула:- .
То есть
— объединение множества всех пар состояний, которые различаются строками длины меньшей с множеством всех пар состояний, которые различаются строками длины ровно .Заметим, что
, причем . Также заметим, что , так как в новых элементов не добавится, поэтому . Значит:- различает и .
Осталось найти такое
и , что тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что , тогда автоматы будут эквивалентны.Будем строить
в порядке увеличения , пока . Заметим, что , так как строка длины 0 одна — это , а различает только пары состоящие из одного терминального состояния и одного нетерминального.Дальше будем получать
по рекуррентной формуле, пока не выполнится условие остановки.Это можно реализовать проще: будем хранить для каждого состояния, из какого состояния есть переход по символу
в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь.Псевдокод
fill(neq, false) for for if q.push( , ) neq[ , ] = True while not isEmpty(q) = q.pop() for for for q.push( , ) neq[ , ] = True if neq[ , ] print("Not equivalent") else print("Equivalent")
Время работы алгоритма
Алгоритм будет работать за
.