Эквивалентность состояний ДКА
| Определение: | 
| Два автомата и называются эквивалентными, если они распознают один и тот же язык над алфавитом , то есть . | 
| Определение: | 
Слово  различает два состояния  и , если 
  | 
| Определение: | 
Два  состояния  и  называются эквивалентными , если не существует строки, которая их различает, то есть   верно, что
  | 
Заметим, что эквивалентность состояний действительно является отношением эквивалентности. Так как  (равносильность) является отношением эквивалентности и в детерминированном автомате всегда существует путь по любому слову, описанное нами отношение является отношением эквивалентности.
| Лемма: | 
, , ,  различает  и . Тогда  различает  и .  | 
| Доказательство: | 
| 
 А значит, по условию различимости для и ,  | 
Пример
Эти два автомата принимают слова из языка слов длины не меньше одного, состоящих из символов алфавита . Стартовые и все допускающие состояния автоматов эквивалентны между собой.
Проверка ДКА на эквивалентность
Заданы два автомата: со стартовым состоянием и со стартовым состоянием соответственно. Нужно проверить их на эквивалентность.
Проверка через минимизацию
Для этого построим автомат , содержащий все состояния обоих автоматов и изначальные переходы между ними. Стартовым состоянием в новом автомате можно сделать  или  — это не имеет значения. (При этом состояния одного из автоматов станут недостижимыми из новый стартовой вершины в новом автомате, но для алгоритма это и не важно.)
![]()
Осталось лишь проверить на эквивалентность состояния  и  в полученном автомате. Их эквивалентность совпадает с эквивалентностью автоматов  и . Для этого можно применить алгоритм минимизации ДКА, который разбивает все состояния на классы эквивалентности. Если состояния  и  нового автомата в одном классе эквивалентности - исходные автоматы эквивалентны.
Проверка через BFS
Алгоритм заключается в синхронном обходе автоматов в ширину, проверяя, что по пути сохраняются терминальные состояния.
Псевдокод:
bfs_equivalence_check()
    queue.push( <0, 0> );
    used1[0] = used2[0] = true;
    while( !q.isEmpty() )
        u = q.front.first;
        v = q.front.second;
        q.pop();
        if(isTerminal1[u] != isTerminal2[v])
            return false;
        for(i = a..z)
            if(!used1[automata1[u][i]] || !used2[automata2[v][i]])
                q.push( <automata1[u][i], automata2[v][i]> );
                used1[automata1[u][i]] = used2[automata2[v][i]] = true;
    return true;
Замечание: в данной реализации оба автомата обязательно должны иметь дьявольские состояния.