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

