Эквивалентность состояний ДКА — различия между версиями
м |
(→Алгоритм проверки эквивалентности автоматов) |
||
Строка 21: | Строка 21: | ||
== Алгоритм проверки эквивалентности автоматов == | == Алгоритм проверки эквивалентности автоматов == | ||
+ | ===Постановка задачи=== | ||
+ | Даны два детерминированных конечных автомата <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>. Требуется определить, эквивалентны ли они. | ||
− | |||
− | |||
{{Лемма | {{Лемма | ||
Строка 35: | Строка 35: | ||
А значит, по условию различимости для <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> 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> | ||
Строка 55: | Строка 55: | ||
Дальше будем получать <tex> D_i </tex> по рекуррентной формуле, пока не выполнится условие остановки. | Дальше будем получать <tex> D_i </tex> по рекуррентной формуле, пока не выполнится условие остановки. | ||
− | Это можно реализовать проще: будем хранить для каждого состояния, из какого состояния есть переход по символу <tex> c </tex> в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь. Псевдокод | + | Это можно реализовать проще: будем хранить для каждого состояния, из какого состояния есть переход по символу <tex> c </tex> в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь. |
+ | ===Псевдокод=== | ||
<font size = 3> | <font size = 3> | ||
<tex> q = \varnothing </tex> | <tex> q = \varnothing </tex> | ||
fill(neq, false) | fill(neq, false) | ||
− | for <tex> p_1 \in Q_1 </tex> | + | for <tex> p_1 \in Q_1 </tex> |
− | for <tex> p_2 \in Q_2 </tex> | + | for <tex> p_2 \in Q_2 </tex> |
− | if <tex> (p_1 \in T_1) \neq (p_2 \in T_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>) | q.push(<tex>p_1</tex>,<tex> p_2</tex>) | ||
− | neq[<tex>p_1</tex>, <tex>p_2</tex>] = True | + | neq[<tex>p_1</tex>, <tex>p_2</tex>] = True |
− | while not isEmpty(q) | + | while not isEmpty(q) |
<tex> \langle p_1, p_2 \rangle </tex> = q.pop() | <tex> \langle p_1, p_2 \rangle </tex> = q.pop() | ||
− | for <tex> c \in \Sigma </tex> | + | for <tex> c \in \Sigma </tex> |
− | for <tex> \delta(e_1, c) = p_1 </tex> | + | for <tex> \delta(e_1, c) = p_1 </tex> |
− | for <tex> \delta(e_2, c) = p_2 </tex> | + | for <tex> \delta(e_2, c) = p_2 </tex> |
q.push(<tex>e_1</tex>, <tex>e_2</tex>) | q.push(<tex>e_1</tex>, <tex>e_2</tex>) | ||
neq[<tex>e_1</tex>, <tex>e_2</tex>] = True | neq[<tex>e_1</tex>, <tex>e_2</tex>] = True | ||
− | if neq[<tex>s_1</tex>, <tex>s_2</tex>] | + | if neq[<tex>s_1</tex>, <tex>s_2</tex>] |
print("Not equivalent") | print("Not equivalent") | ||
else | else | ||
print("Equivalent") | print("Equivalent") | ||
</font> | </font> | ||
− | + | ===Время работы алгоритма=== | |
− | Алгоритм будет работать за <tex> | + | Алгоритм будет работать за <tex> O(|Q_1||Q_2||\Sigma|^2)</tex>. |
[[Категория: Теория формальных языков]] | [[Категория: Теория формальных языков]] |
Версия 06:08, 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")
Время работы алгоритма
Алгоритм будет работать за
.