Эквивалентность состояний ДКА — различия между версиями
Leugenea (обсуждение | вклад) м |
м |
||
Строка 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> называются | + | |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>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> называются | + | |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>. | ||
}} | }} |
Версия 06:11, 8 декабря 2011
Определение: |
Два автомата | и называются эквивалентными, если они распознают один и тот же язык над алфавитом , то есть .
Определение: |
Слово
| различает два состояния и , если
Определение: |
Два состояния
| и называются эквивалентными , если не существует строки, которая их различает, то есть верно, что
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как является отношением эквивалентности, и , что и доказывает, что описанное нами отношение является отношением эквивалентности.
Пример
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита
. Все допускающие состояния автоматов эквивалентны между собой.Алгоритм проверки эквивалентности автоматов
Задано: Два детерминированных конечных автомата
Необходимо определить: Эквивалентны ли эти автоматы
Лемма: |
|
Доказательство: |
А значит, по условию различимости для и , |
Рассмотрим такие семейства множеств:
- различает и
Для
существует рекуррентная формула:То есть
— объединение множества всех пар состояний, которые различаются строками длины, меньшей , с множеством всех пар состояний, которые различаются строками длины ровноЗаметим, что
, причем . И еще заметим, что , так как в новых элементов не добавится, поэтому . Значит:- различает и
Осталось найти такое
и , что тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что , тогда автоматы будут эквивалентны.Будем строить
в порядке увеличения , пока . Заметим, что , так как строка длины 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")
Алгоритм будет работать за