Эквивалентность состояний ДКА — различия между версиями
Leugenea (обсуждение | вклад) м (Пунктуация и орфография) |
|||
Строка 35: | Строка 35: | ||
Для <tex> D_i </tex> существует рекуррентная формула: | Для <tex> D_i </tex> существует рекуррентная формула: | ||
* <tex> D_i = D_{i - 1} \cup \lbrace \langle p, q \rangle | \exists c \in \Sigma : \langle \delta(p, c), \delta(q, c) \rangle \in E_{i - 1} \rbrace </tex> | * <tex> D_i = D_{i - 1} \cup \lbrace \langle p, q \rangle | \exists c \in \Sigma : \langle \delta(p, c), \delta(q, c) \rangle \in E_{i - 1} \rbrace </tex> | ||
− | То есть <tex> D_i </tex> {{---}} объединение множества всех пар состояний, которые различаются строками длины | + | То есть <tex> D_i </tex> {{---}} объединение множества всех пар состояний, которые различаются строками длины, меньшей <tex> i </tex>, с множеством всех пар состояний, которые различаются строками длины ровно <tex> i </tex> |
Заметим, что <tex> \exists k : E_k = \varnothing </tex>, причем <tex> k \le |Q| ^ 2</tex>. И еще заметим, что <tex> E_k = \varnothing \Rightarrow E_{k + 1} = \varnothing </tex>, так как в <tex> D_{k+1}</tex> новых элементов не добавится, поэтому <tex> D_{k+1} = D_k </tex>. | Заметим, что <tex> \exists k : E_k = \varnothing </tex>, причем <tex> k \le |Q| ^ 2</tex>. И еще заметим, что <tex> E_k = \varnothing \Rightarrow E_{k + 1} = \varnothing </tex>, так как в <tex> D_{k+1}</tex> новых элементов не добавится, поэтому <tex> D_{k+1} = D_k </tex>. | ||
Строка 44: | Строка 44: | ||
Будем строить <tex> D_i </tex> в порядке увеличения <tex> i </tex>, пока <tex> D_i \neq D_{i - 1}</tex>. | Будем строить <tex> D_i </tex> в порядке увеличения <tex> i </tex>, пока <tex> D_i \neq D_{i - 1}</tex>. | ||
− | Заметим, что <tex> D_0 = \lbrace \langle p, q\rangle | p \in T_1 \Leftrightarrow q \notin T_2 \rbrace </tex>, так как строка длины 0 одна | + | Заметим, что <tex> D_0 = \lbrace \langle p, q\rangle | p \in T_1 \Leftrightarrow q \notin T_2 \rbrace </tex>, так как строка длины 0 одна {{---}} это <tex> \varepsilon </tex>, а <tex> \varepsilon </tex> различает только пары состоящие из одного терминального состояния и одного нетерминального. |
− | Дальше будем получать <tex> D_i </tex> по рекуррентной формуле пока не выполнится условие остановки. | + | Дальше будем получать <tex> D_i </tex> по рекуррентной формуле, пока не выполнится условие остановки. |
− | Это можно реализовать проще: будем хранить для каждого состояния, из какого | + | Это можно реализовать проще: будем хранить для каждого состояния, из какого состояния есть переход по символу <tex> c </tex> в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь. Псевдокод: |
<font size = 3> | <font size = 3> | ||
<tex> q = \varnothing </tex> | <tex> q = \varnothing </tex> |
Версия 06:20, 14 ноября 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")
Алгоритм будет работать за