Построение по НКА эквивалентного ДКА, алгоритм Томпсона — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм)
Строка 1: Строка 1:
 
[[Категория: Теория формальных языков]]
 
[[Категория: Теория формальных языков]]
 
== Алгоритм систем подмножеств ==
 
== Алгоритм систем подмножеств ==
Смысл алгоритма состоит в замене множества из <tex>n</tex> состояний НКА, множеством из <tex>2^n</tex> подмножеств его состояний.
+
Данный алгоритм заменяет НКА из <tex>n</tex> состояний на эквивалентный ДКА из <tex>2^n</tex> состояний.
 
=== Алгоритм ===
 
=== Алгоритм ===
Генерируем все подмножества множества состояний НКА {{---}} это состояния ДКА.
+
'''Задание состояний:'''
Далее для всевозможных <tex>(q_1, q_2)</tex> {{---}} пар состояний ДКА и символов <tex>c</tex> {{---}} добавляем переход из <tex>q_1</tex> в <tex>q_2</tex> по <tex>c</tex>, если для каждого состояния НКА из <tex>q_1</tex> есть переход по <tex>c</tex> в состояние из <tex>q_2</tex> и, наоборот, в каждое состояние НКА из <tex>q_2</tex> есть переход из состояния из <tex>q_1</tex> по <tex>c</tex>
+
 
 +
Состояние нашего ДКА будет соответствовать подмножеству состояний НКА - то есть их будет ровно <tex>2^n</tex>.
 +
 
 +
'''Задание переходов:'''
 +
 
 +
Возьмём состояние нашего ДКА <tex>q</tex>, соответствующее подмножеству состояний НКА {{---}} <tex>(a_1, a_2, ..., a_m)</tex>, и символ <tex>c</tex>. Тогда <tex>\delta_D(q, c) = p</tex>, где p - состояние ДКА, соответствующее подмножеству состояний НКА - <tex>\cup_{i=1}^{m} \delta(a_i, c)</tex>, где <tex>\delta_D</tex> {{---}} функция перехода в ДКА, а <tex>\delta</tex> {{---}} функция перехода в НКА.
 +
 
 +
'''Задание стартового состояния:'''
 +
 
 +
Стартовое состояние - состояние ДКА, соответствующее множеству из одного стартового состояния НКА.
 +
 
 +
'''Задание терминальных вершин:'''
 +
 
 +
Если в подмножестве состояний НКА есть хотя бы одна терминальная вершина, то вершина ДКА, соответствующая этому подмножеству, будет терминальной.
 +
 
 +
'''Терминология:'''
 +
 
 +
<tex>q</tex> - состояние НКА.
 +
 
 +
<tex>q_d</tex> - состояние ДКА.
 +
 
 +
<tex>\delta</tex> - функция перехода в НКА.
 +
 
 +
<tex>\delta_D</tex> - функция перехода в ДКА.
 +
 
 +
<tex>q \in q_d</tex> - <tex>q</tex> принадлежит <tex>q_d</tex>, если множество состояний НКА, соответствующее состоянию <tex>q_d</tex>, содержит состояние <tex>q</tex>.
 +
 
 +
===Доказательство эквивалентности===
 +
{{Теорема
 +
|statement=
 +
Построенный ДКА эквивалентен данному НКА.
 +
|proof=
 +
&nbsp;<tex>1.</tex> Докажем, что любое слово, которое принимает НКА, будет принято построенным ДКА.
 +
 
 +
Сделаем наблюдение, что если <tex>q \in q_d</tex> и символ перехода - <tex>c</tex>, то <tex>\forall p \in \delta(q, c)</tex>: <tex>p \in \delta_D(q_d, c)</tex>.
 +
 
 +
Рассмотрим последовательность состояний НКА, когда принимали слово - <tex>(q_1, ..., q_m)</tex> - и последовательность состояний ДКА, когда принимали слово - <tex>({q_d}_1, ..., {q_d}_m)</tex>.
 +
 
 +
Мы знаем, что <tex>q_m</tex> - терминальная, так как НКА принимает слово. Надо доказать, что <tex>{q_d}_m</tex> - терминальная.
 +
 
 +
Заметим, что <tex>q_1 \in {q_d}_1</tex> - так как это стартовые состояния, а, значит, по нашему наблюдению <tex>q_2 \in {q_d}_2</tex> и так далее. Получается, что <tex>q_m \in {q_d}_m</tex>. Мы знаем, что <tex>q_m</tex> - терминальная вершина, а, значит, по определению терминальной вершины в нашем ДКА, что <tex>{q_d}_m</tex> - тоже терминальная.
 +
 
 +
&nbsp;<tex>2.</tex> Докажем, что любое слово, которое принимает построенный ДКА, принимает и НКА.
 +
 
 +
Рассмотрим последовательность состояний НКА, когда принимали слово - <tex>(q_1, ..., q_m)</tex> - и последовательность состояний ДКА, когда принимали слово - <tex>({q_d}_1, ..., {q_d}_m)</tex>.
 +
 
 +
Мы знаем, что <tex>{q_d}_m</tex> - терминальная, так как ДКА принимает слово. Надо доказать, что <tex>q_m</tex> - терминальная.
 +
 
 +
 
 +
}}
  
 
== Алгоритм Томпсона ==
 
== Алгоритм Томпсона ==

Версия 21:50, 20 октября 2011

Алгоритм систем подмножеств

Данный алгоритм заменяет НКА из [math]n[/math] состояний на эквивалентный ДКА из [math]2^n[/math] состояний.

Алгоритм

Задание состояний:

Состояние нашего ДКА будет соответствовать подмножеству состояний НКА - то есть их будет ровно [math]2^n[/math].

Задание переходов:

Возьмём состояние нашего ДКА [math]q[/math], соответствующее подмножеству состояний НКА — [math](a_1, a_2, ..., a_m)[/math], и символ [math]c[/math]. Тогда [math]\delta_D(q, c) = p[/math], где p - состояние ДКА, соответствующее подмножеству состояний НКА - [math]\cup_{i=1}^{m} \delta(a_i, c)[/math], где [math]\delta_D[/math] — функция перехода в ДКА, а [math]\delta[/math] — функция перехода в НКА.

Задание стартового состояния:

Стартовое состояние - состояние ДКА, соответствующее множеству из одного стартового состояния НКА.

Задание терминальных вершин:

Если в подмножестве состояний НКА есть хотя бы одна терминальная вершина, то вершина ДКА, соответствующая этому подмножеству, будет терминальной.

Терминология:

[math]q[/math] - состояние НКА.

[math]q_d[/math] - состояние ДКА.

[math]\delta[/math] - функция перехода в НКА.

[math]\delta_D[/math] - функция перехода в ДКА.

[math]q \in q_d[/math] - [math]q[/math] принадлежит [math]q_d[/math], если множество состояний НКА, соответствующее состоянию [math]q_d[/math], содержит состояние [math]q[/math].

Доказательство эквивалентности

Теорема:
Построенный ДКА эквивалентен данному НКА.
Доказательство:
[math]\triangleright[/math]

 [math]1.[/math] Докажем, что любое слово, которое принимает НКА, будет принято построенным ДКА.

Сделаем наблюдение, что если [math]q \in q_d[/math] и символ перехода - [math]c[/math], то [math]\forall p \in \delta(q, c)[/math]: [math]p \in \delta_D(q_d, c)[/math].

Рассмотрим последовательность состояний НКА, когда принимали слово - [math](q_1, ..., q_m)[/math] - и последовательность состояний ДКА, когда принимали слово - [math]({q_d}_1, ..., {q_d}_m)[/math].

Мы знаем, что [math]q_m[/math] - терминальная, так как НКА принимает слово. Надо доказать, что [math]{q_d}_m[/math] - терминальная.

Заметим, что [math]q_1 \in {q_d}_1[/math] - так как это стартовые состояния, а, значит, по нашему наблюдению [math]q_2 \in {q_d}_2[/math] и так далее. Получается, что [math]q_m \in {q_d}_m[/math]. Мы знаем, что [math]q_m[/math] - терминальная вершина, а, значит, по определению терминальной вершины в нашем ДКА, что [math]{q_d}_m[/math] - тоже терминальная.

 [math]2.[/math] Докажем, что любое слово, которое принимает построенный ДКА, принимает и НКА.

Рассмотрим последовательность состояний НКА, когда принимали слово - [math](q_1, ..., q_m)[/math] - и последовательность состояний ДКА, когда принимали слово - [math]({q_d}_1, ..., {q_d}_m)[/math].

Мы знаем, что [math]{q_d}_m[/math] - терминальная, так как ДКА принимает слово. Надо доказать, что [math]q_m[/math] - терминальная.
[math]\triangleleft[/math]

Алгоритм Томпсона

Данный алгоритм используется для преобразования НКА в ДКА. Смысл этого алгоритма, как и предыдущего, состоит в замене множества из [math]n[/math] состояний НКА, множеством из [math]2^n[/math] подмножеств его состояний. Но не все из [math]2^n[/math] состояний будут присутствовать в ДКА, ввиду недостижимости многих из них, поэтому в алгоритме используется обход в ширину.

Алгоритм

Вначале в очередь помещается множество, состоящее только из стартового состояния НКА [math]{q_0}[/math]. Затем из очереди изымается очередное множество [math]P[/math] — новое состояние ДКА. Если в [math]P[/math] есть допускающие состояния, то оно допускающее. Функция перехода строится по следующему правилу: [math]\delta_D(P, c) = \bigcup_{q_i \in P}\delta_N(q_i, c)[/math].
В результате [math]\delta_D(P, c)[/math] задаст новое состояние [math]Q[/math] автомата. Если [math]Q[/math] еще нет в ДКА, тогда мы помещаем [math]Q[/math] в очередь. Так как [math]|Q_N|[/math] - конечна, а [math]|Q_D| \le 2^{|Q_N|}[/math], то алгоритм завершится за конечное число шагов. Отсюда же получается верхняя оценка на время работы алгоритма — в худшем случае это [math]O(2^n)[/math].

Корректность

Утверждение:
Построенный автомат принимает тот же язык
[math]\triangleright[/math]

Применим индукцию по длине слова [math]\omega[/math].

  • [math]|\omega|=1[/math]: По построению стартовое состояние ДКА будет [math]{s}[/math], где [math]s[/math] — стартовое состояние НКА, причем допускать они могут только одновременно.
  • Пусть для [math]|\omega|=n[/math] - это верно, докажем, что верно и для [math]|\omega|=n+1[/math]:
Пусть НКА на шаге n мог находиться в состояниях [math]{q_1...q_k}[/math], тогда ДКА, по построению, находится в состоянии [math]Q={q_1...q_k}[/math]. После перехода по [math]\omega[n+1] = c[/math] НКА будет находиться в состояниях [math]{\delta_N(q_1, c)...\delta_N(q_k, c)}[/math], а ДКА в состоянии [math]P=\delta_D(Q, c)[/math], причем, в силу построения, оно будет допускающим, когда одно из [math]{\delta_N(q_1, c)...\delta_N(q_k, c)}[/math] — допускающее. Что нам и требовалось.
[math]\triangleleft[/math]