Эквивалентность состояний ДКА — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Какой-то отстой не по теме был написан, все нафиг поудалял, написал нормально)
Строка 1: Строка 1:
[[Категория: Теория формальных языков]]
 
== Эквивалентность автоматов ==
 
 
 
{{Определение
 
{{Определение
|definition = Два <em> автомата</em> <tex> \mathcal{A}_1 = \langle Q_1,\Sigma,\delta_1,s_{10}, T_1\subseteq Q_1 \rangle </tex> и <tex>\mathcal{A}_2 = \langle Q_2,\Sigma,\delta_2,s_{20}, T_2\subseteq Q_2 \rangle </tex> называются <em>эквивалентными</em>, если они распознают один и тот же язык над алфавитом <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> называются <em>эквивалентными</em>, если они распознают один и тот же язык над алфавитом <tex>\Sigma</tex>, то есть <tex>\mathcal{L}(\mathcal{A}_1) = \mathcal{L}(\mathcal{A}_2)</tex>
 
}}
 
}}
  
Строка 16: Строка 13:
 
}}
 
}}
  
*'''Пример двух эквивалентных автоматов:'''
+
== Алгоритм проверки эквивалентности автоматов ==
[[Изображение:Automata1.png]][[Изображение:Automata2.png]]
+
 
 +
'''Задано''': Два детерминированных конечных автомата <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> <br>
 +
'''Необходимо определить''': Эквивалентны ли эти автоматы <br>
  
<em>Состояния <tex>B</tex> и <tex>C</tex> допускающие.</em>
+
{{Лемма
 +
|statement =
 +
<tex> \mathcal{A} = \langle Q, \Sigma, \delta, s, T \rangle </tex>
 +
* <tex> p_1, p_2, q_1, q_2 \in Q </tex>
 +
* <tex> q_i = \delta(p_i, c) </tex>
 +
* <tex> w \in \Sigma^*</tex> различает <tex> q_1 </tex> и <tex> q_2 \Rightarrow cw </tex> различает <tex> p_1 </tex> и <tex> p_2 </tex>
 +
|proof =
 +
<tex> \langle p_i, cw \rangle \vdash \langle q_i, w \rangle \vdash^* \langle t_i, \varepsilon \rangle </tex>
 +
А значит, по условию различимости для <tex> q_1 </tex> и <tex> q_2</tex> , <tex> t_1 \in T \Leftrightarrow t_2 \notin T </tex>
 +
}}
 +
<br>
 +
Рассмотрим такие семейства множеств:
 +
* <tex> D_i = \lbrace \langle q, p\rangle | q \in Q_1, p \in Q_2, \exists w : |w| \le i, w </tex> различает <tex> q </tex> и <tex> p \rbrace </tex>
 +
* <tex> E_i = D_i \setminus D_{i - 1} </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 </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> E_k = \varnothing \Rightarrow D_k = \lbrace \langle q, p\rangle | q \in Q_1, p \in Q_2, \exists w : w </tex> различает <tex> q </tex> и <tex> p \rbrace = \lbrace \langle q, p\rangle | (q \nsim p)\rbrace</tex>
 +
 
 +
Осталось найти такое <tex> k </tex> и <tex> D_k </tex>, что <tex> E_k = \varnothing </tex> тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что <tex> \langle s_1, s_2 \rangle \notin D_k </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> \varepsilon </tex>, а <tex> \varepsilon </tex> различает только пары состоящие из одного терминального состояния и одного нетерминального.
 +
 
 +
Дальше будем получать <tex> D_i </tex> по рекуррентной формуле пока не выполнится условие остановки.
 +
 
 +
Это можно реализовать проще: будем хранить для каждого состояния, из какого состояние есть переход по символу <tex> c </tex> в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь. Псевдокод:
 +
<font size = 3>
 +
    <tex> q = \varnothing </tex>
 +
    fill(neq, false)
 +
    for <tex> p_1 \in Q_1 </tex>:
 +
        for <tex> p_2 \in Q_2 </tex>:
 +
            if <tex> (p_1 \in T_1) \neq (p_2 \in T_2) </tex>:
 +
                q.push(<tex>p_1</tex>,<tex> p_2</tex>)
 +
                neq[<tex>p_1</tex>, <tex>p_2</tex>] = True;
 +
    while not isEmpty(q):
 +
        <tex> \langle p_1, p_2 \rangle </tex> = q.pop()
 +
        for <tex> c \in \Sigma </tex> :
 +
            for <tex> \delta(e_1, c) = p_1 </tex>:
 +
                for <tex> \delta(e_2, c) = p_2 </tex>:
 +
                    q.push(<tex>e_1</tex>, <tex>e_2</tex>)
 +
                    neq[<tex>e_1</tex>, <tex>e_2</tex>] = True
 +
    if neq[<tex>s_1</tex>, <tex>s_2</tex>]:
 +
        print("Not equivalent")
 +
    else
 +
        print("Equivalent")
 +
</font>
  
== Литература ==
+
Алгоритм будет работать за <tex> \mathcal O(|Q_1||Q_2||\Sigma|^2)</tex>
 +
[[Категория: Теория формальных языков]]

Версия 04:05, 14 ноября 2011

Определение:
Два автомата [math] \mathcal{A}_1 = \langle Q_1,\Sigma,\delta_1,s_{1}, T_1\subseteq Q_1 \rangle [/math] и [math]\mathcal{A}_2 = \langle Q_2,\Sigma,\delta_2,s_{2}, T_2\subseteq Q_2 \rangle [/math] называются эквивалентными, если они распознают один и тот же язык над алфавитом [math]\Sigma[/math], то есть [math]\mathcal{L}(\mathcal{A}_1) = \mathcal{L}(\mathcal{A}_2)[/math]


Определение:
Слово [math]z \in \Sigma^*[/math] различает два состояния [math]q_i[/math] и [math]q_j[/math], если
  • [math] \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 [/math].


Определение:
Два состояния [math]q_i[/math] и [math]q_j[/math] называются эквивалентными [math](q_i \sim q_j)[/math], если не существует строки, которая их различает, то есть [math]\forall z\in \Sigma^*[/math] верно, что
  • [math] \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 [/math].


Алгоритм проверки эквивалентности автоматов

Задано: Два детерминированных конечных автомата [math] \mathcal{A}_1 = \langle Q_1,\Sigma,\delta_1,s_{1}, T_1\subseteq Q_1 \rangle [/math] и [math]\mathcal{A}_2 = \langle Q_2,\Sigma,\delta_2,s_{2}, T_2\subseteq Q_2 \rangle [/math]
Необходимо определить: Эквивалентны ли эти автоматы

Лемма:
[math] \mathcal{A} = \langle Q, \Sigma, \delta, s, T \rangle [/math]
  • [math] p_1, p_2, q_1, q_2 \in Q [/math]
  • [math] q_i = \delta(p_i, c) [/math]
  • [math] w \in \Sigma^*[/math] различает [math] q_1 [/math] и [math] q_2 \Rightarrow cw [/math] различает [math] p_1 [/math] и [math] p_2 [/math]
Доказательство:
[math]\triangleright[/math]

[math] \langle p_i, cw \rangle \vdash \langle q_i, w \rangle \vdash^* \langle t_i, \varepsilon \rangle [/math]

А значит, по условию различимости для [math] q_1 [/math] и [math] q_2[/math] , [math] t_1 \in T \Leftrightarrow t_2 \notin T [/math]
[math]\triangleleft[/math]


Рассмотрим такие семейства множеств:

  • [math] D_i = \lbrace \langle q, p\rangle | q \in Q_1, p \in Q_2, \exists w : |w| \le i, w [/math] различает [math] q [/math] и [math] p \rbrace [/math]
  • [math] E_i = D_i \setminus D_{i - 1} [/math]

Для [math] D_i [/math] существует рекуррентная формула:

  • [math] 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 [/math]

То есть [math] D_i [/math] — объединение множества всех пар состояний, которые различаются строками длины меньшими [math] i [/math], с множеством всех пар состояний, которые различаются строками длины ровно [math] i [/math]

Заметим, что [math] \exists k : E_k = \varnothing [/math], причем [math] k \le |Q| ^ 2[/math]. И еще заметим, что [math] E_k = \varnothing \Rightarrow E_{k + 1} = \varnothing [/math], так как в [math] D_{k+1}[/math] новых элементов не добавится, поэтому [math] D_{k+1} = D_k [/math]. Значит:

  • [math] E_k = \varnothing \Rightarrow D_k = \lbrace \langle q, p\rangle | q \in Q_1, p \in Q_2, \exists w : w [/math] различает [math] q [/math] и [math] p \rbrace = \lbrace \langle q, p\rangle | (q \nsim p)\rbrace[/math]

Осталось найти такое [math] k [/math] и [math] D_k [/math], что [math] E_k = \varnothing [/math] тогда мы узнаем пары неэквивалентных состояний, останется только проверить, что [math] \langle s_1, s_2 \rangle \notin D_k [/math], тогда автоматы будут эквивалентны.

Будем строить [math] D_i [/math] в порядке увеличения [math] i [/math], пока [math] D_i \neq D_{i - 1}[/math]. Заметим, что [math] D_0 = \lbrace \langle p, q\rangle | p \in T_1 \Leftrightarrow q \notin T_2 \rbrace [/math], так как строка длины 0 одна, это [math] \varepsilon [/math], а [math] \varepsilon [/math] различает только пары состоящие из одного терминального состояния и одного нетерминального.

Дальше будем получать [math] D_i [/math] по рекуррентной формуле пока не выполнится условие остановки.

Это можно реализовать проще: будем хранить для каждого состояния, из какого состояние есть переход по символу [math] c [/math] в наше. В очередь будем класть пары неэквивалентных состояний. Дальше вытаскивая из очереди пару, рассмотрим все пары состояний, из которых есть переход по одинаковому символу в элементы пары из очереди. Пометим их неэквивалентными и положим в очередь. Псевдокод:

   [math] q = \varnothing [/math]
   fill(neq, false)
   for [math] p_1 \in Q_1 [/math]:
       for [math] p_2 \in Q_2 [/math]:
           if [math] (p_1 \in T_1) \neq (p_2 \in T_2) [/math]:
               q.push([math]p_1[/math],[math] p_2[/math])
               neq[[math]p_1[/math], [math]p_2[/math]] = True;
   while not isEmpty(q):
       [math] \langle p_1, p_2 \rangle [/math] = q.pop()
       for [math] c \in \Sigma [/math] :
           for [math] \delta(e_1, c) = p_1 [/math]:
               for [math] \delta(e_2, c) = p_2 [/math]:
                   q.push([math]e_1[/math], [math]e_2[/math])
                   neq[[math]e_1[/math], [math]e_2[/math]] = True
   if neq[[math]s_1[/math], [math]s_2[/math]]:
       print("Not equivalent")
   else
       print("Equivalent")

Алгоритм будет работать за [math] \mathcal O(|Q_1||Q_2||\Sigma|^2)[/math]