Эквивалентность состояний ДКА — различия между версиями
| Строка 1: | Строка 1: | ||
| + | ==Основные определения== | ||
{{Определение | {{Определение | ||
|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> называются '''эквивалентными''', если они распознают один и тот же язык над алфавитом <tex>\Sigma</tex>, то есть <tex>\mathcal{L}(\mathcal{A}_1) = \mathcal{L}(\mathcal{A}_2)</tex>. | |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> называются '''эквивалентными''', если они распознают один и тот же язык над алфавитом <tex>\Sigma</tex>, то есть <tex>\mathcal{L}(\mathcal{A}_1) = \mathcal{L}(\mathcal{A}_2)</tex>. | ||
| Строка 5: | Строка 6: | ||
{{Определение | {{Определение | ||
|definition = Слово <tex>z \in \Sigma^*</tex> '''различает''' два состояния <tex>q_i</tex> и <tex>q_j</tex>, если | |definition = Слово <tex>z \in \Sigma^*</tex> '''различает''' два состояния <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> \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> называются '''эквивалентными''' <tex>(q_i \sim q_j)</tex>, если не существует строки, которая их различает, то есть <tex>\forall z \in \Sigma^*</tex> верно, что | |definition = Два <em> состояния</em> <tex>q_i</tex> и <tex>q_j</tex> называются '''эквивалентными''' <tex>(q_i \sim q_j)</tex>, если не существует строки, которая их различает, то есть <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>. | + | * <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>. |
}} | }} | ||
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как <tex> \Leftrightarrow </tex> (равносильность) является отношением эквивалентности и <tex> \forall z \in \Sigma^*\ \forall q \in Q \ \exists ! t : \langle q, z \rangle \vdash^* \langle t, \varepsilon \rangle </tex>, поэтому описанное нами отношение является отношением эквивалентности. | Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как <tex> \Leftrightarrow </tex> (равносильность) является отношением эквивалентности и <tex> \forall z \in \Sigma^*\ \forall q \in Q \ \exists ! t : \langle q, z \rangle \vdash^* \langle t, \varepsilon \rangle </tex>, поэтому описанное нами отношение является отношением эквивалентности. | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
{{Лемма | {{Лемма | ||
| Строка 27: | Строка 23: | ||
А значит, по условию различимости для <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> | ||
}} | }} | ||
| + | |||
| + | == Пример == | ||
| + | [[Файл:avtomat2.png|350px]] [[Файл:avtomat3.png|350px]] | ||
| + | |||
| + | Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита <tex> \lbrace 0, 1\rbrace </tex>. Стартовые и все допускающие состояния автоматов эквивалентны между собой. | ||
== Алгоритм проверки эквивалентности автоматов == | == Алгоритм проверки эквивалентности автоматов == | ||
Версия 19:23, 23 января 2012
Содержание
Основные определения
| Определение: |
| Два автомата и называются эквивалентными, если они распознают один и тот же язык над алфавитом , то есть . |
| Определение: |
Слово различает два состояния и , если
|
| Определение: |
Два состояния и называются эквивалентными , если не существует строки, которая их различает, то есть верно, что
|
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как (равносильность) является отношением эквивалентности и , поэтому описанное нами отношение является отношением эквивалентности.
| Лемма: |
, , , различает и . Тогда различает и . |
| Доказательство: |
|
А значит, по условию различимости для и , |
Пример
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита . Стартовые и все допускающие состояния автоматов эквивалентны между собой.
Алгоритм проверки эквивалентности автоматов
Постановка задачи
Даны два детерминированных конечных автомата и . Требуется определить, эквивалентны ли они.
Алгоритм
Рассмотрим такие семейства множеств:
- различает и ;
- .
Для существует рекуррентная формула:
- .
То есть — объединение множества всех пар состояний, которые различаются строками длины меньшей с множеством всех пар состояний, которые различаются строками длины ровно .
Заметим, что , причем . Также заметим, что , так как в новых элементов не добавится, поэтому . Значит:
- различает и .
Осталось найти такое и , что тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что , тогда автоматы будут эквивалентны.
Будем строить в порядке увеличения , пока . Заметим, что , так как строка длины 0 одна — это , а различает только пары состоящие из одного терминального состояния и одного нетерминального.
Дальше будем получать по рекуррентной формуле, пока не выполнится условие остановки.
Это можно реализовать проще: будем хранить для каждого состояния, из какого состояния есть переход по символу в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь.
Псевдокод
fill(neq, false) for for if q.push(,) neq[, ] = True while not isEmpty(q) = q.pop() for for for if neq[, ] continue q.push(, ) neq[, ] = True if neq[, ] print("Not equivalent") else print("Equivalent")
Время работы алгоритма
Оценим время работы алгоритма. Заметим, что каждая пара состояния будет добавлена в очередь, не более одного раза. Поэтому цикл while выполнится не более чем раз. А значит в этом же цикле каждая пара ребер будет просмотрена не более одного раза, потому что для каждой вершины мы просматриваем все входящие ребра. А значит внутренний if neq[, ] выполнится порядка , потому что это верхняя оценка на количество ребер в детерминированном автомате — . А значит алгоритм будет работать за .

