Изменения

Перейти к: навигация, поиск

Детерминированные конечные автоматы

9439 байт добавлено, 19:20, 4 сентября 2022
м
rollbackEdits.php mass rollback
{{В разработкеОпределение|definition='''Детерминированный конечный автомат (ДКА)''' (англ. ''deterministic finite automaton (DFA)'') — набор из пяти элементов <tex>\langle \Sigma , Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to Q \rangle</tex>, где <tex>\Sigma</tex> — алфавит (англ. ''alphabet''), <tex>Q</tex> — множество состояний (англ. ''finite set of states''), <tex>s</tex> — начальное (стартовое) состояние (англ. ''start state''), <tex>T</tex> — множество допускающих состояний (англ. ''set of accept states''), <tex>\delta</tex> — функция переходов (англ. ''transition function'').}}
== Детерминированный конечный автомат Процесс допуска ==Изначально автомат находится в стартовом состоянии <tex>s</tex>. Автомат считывает символы по очереди. При считывании очередного символа <tex>p_i</tex> автомат переходит в состояние <tex>\delta(q, p_i)</tex>, где <tex>q</tex> — текущее состояние автомата. Процесс продолжается до тех пор, пока не будет достигнут конец входного слова.
{{Определение
|id=допускает
|definition=
Детерминированный конечный Будем говорить, что автомат'''допускает''' (ДКАангл. ''accept'') --- набор из пяти элементов <tex>\langle \Sigma слово, Q, s \in Q, T \subset Q, \delta : Q \times \Sigma \to Q \rangle</tex>, где <tex>\Sigma</tex> -- алфавит, <tex>Q</tex> -- множество состояний автомата, <tex>s</tex> -- начальное состояние автомата, <tex>T</tex> -- Множество допускающих состояний автомата, <tex>\delta</tex> -- функция переходовесли после окончания описанного выше процесса автомат окажется в допускающем состоянии.
}}
=== Процесс допуска ===Процесс допуска слова автоматом выглядит так: * Изначально автомат находится '''Замечание.''' Если в стартовом состоянии* Ему на вход подается строка* Далее на каждом шагу какой-то момент из текущего состояния нет перехода по считанному символу, то будем считать, что автомат берет новый символ строки и совершает соответствующий не допускает данное слово. При реализации вместо отдельного рассмотрения данного случая иногда удобно вводить фиктивную нетерминальную '''''«дьявольскую вершину»''''' (также '''''тупиковое состояние''''', '''''сток'''''), из которой любой переход ведет в новое состояние* Слово считается допущеннымнеё же саму, если после того, как прочитаны и заменить все его символы, автомат оказался несуществующие переходы на переходы в допускающем состоянии«дьявольскую вершину».
Для удобства можно ввести следующие обозначения== Способы представления =====Диаграмма переходов=== Диаграмма переходов — граф, вершины которого соответствуют состояниям автомата, а рёбра — переходам между состояниями.:<tex>\bigcirc</tex> — нетерминальное состояние,:<tex>\circledcirc</tex> — терминальное состояние,:Стрелка <tex>\downarrow</tex> указывает на начальное состояние.{| class = "wikitable" !Пример!!Описание|-align="center"| style="background-color:white;" | [[Файл:Automata_Search.png|340px]]|Автомат для поиска образца в тексте для строки <tex>abbab</tex>.|-align="center"| style="background-color:white;" | [[Файл:Finite state machine 1.png|250 px]]|Автомат, принимающий непустые строки из чередующихся символов <tex>a</tex> и <tex>b</tex>,без «дьявольской вершины». |-align="center"| style="background-color:white;" | [[Файл:Finite state machine 2.png|200 px]]|Автомат, принимающий непустые строки из чередующихся символов <tex>a</tex> и <tex>b</tex>, с «дьявольской вершиной». |-align="center"|} ===Таблица переходов=== Таблица переходов <tex>T (|Q| \times |\Sigma|)</tex>, дающая табличное представление функции <tex>\delta</tex>. <tex>M = (Q, \Sigma , \delta, q_0, F)</tex>, где* <tex>Q = {S_1, S_2}</tex>,*<tex>\Sigma = \{0, 1 \}</tex>,*<tex>q_0 = S_1</tex>,*<tex>F = {S_1}</tex>, *<tex>\delta</tex> {{---}} функция переходов, представленная таблицей::{| class="wikitable" border="1" style="border-collapse:collapse"! !! <center><tex>0</tex></center> !! <center><tex>1</tex></center>|-!<tex>S_1</tex> | <tex>S_2</tex> | <tex>S_1</tex>|-!<tex>S_2</tex> | <tex>S_1</tex> | <tex>S_2</tex>|} == Автоматные языки =={{Определение|definition='''Мгновенное описание''' ('''конфигурация''') (англ. ''snapshot'') {{---}} пара <tex>\langle q, \alpha \rangle</tex>, где <tex>q</tex> {{---}} текущее состояние, <tex>\alpha</tex> {{---}} оставшиеся символы.}}Будем говорить, что конфигурация <tex>\langle p, \beta \rangle</tex> выводима из <tex>\langle q, \alpha \rangle</tex> за один шаг <tex>(\langle q, \alpha \rangle \vdash \langle p, \beta \rangle)</tex>, если:** <tex>\alpha = c\beta</tex>,** <tex>\delta (q, c)=p </tex>.Будем говорить, что конфигурация <tex>\langle p, \beta \rangle</tex> выводима из <tex>\langle q, \alpha \rangle</tex> за конечное число шагов <tex>(\langle q, \alpha \rangle \vdash^* \langle p, \beta \rangle)</tex>, если <tex>\exists n:</tex>* <tex>\alpha = c_1 c_2 ... c_n\beta</tex>,* <tex>\langle q, c_1 c_2 c_3 ... c_n\beta \rangle \vdash \langle u_1, c_2 c_3 ... c_n\beta \rangle \vdash \langle u_2, c_3 ... c_n\beta \rangle \vdash ... \vdash \langle u_{n-1}, c_n\beta \rangle \vdash \langle p, \beta \rangle</tex>.
* <tex>\langle q, \alpha \rangle \vdash^* \langle p, \beta \rangle</tex>, если
** <tex>\langle q, c_1 c_2 c_3 ...c_n\beta \rangle \vdash \langle u_1, c_2 c_3 ...c_n\beta \rangle \vdash \langle u_2, c_3 ...c_n\beta \rangle ...\vdash \langle u_{n-1}, c_n\beta \rangle \vdash \langle p, \beta \rangle</tex>
{{Лемма
|statement=
<tex>\langle q, \alpha \rangle \vdash^* \langle p, \varepsilon \rangle, \langle p, \beta \rangle \vdash^* \langle r, \varepsilon \rangle \Rightarrow \langle q, \alpha\beta \rangle \vdash^* \langle r, \varepsilon \rangle</tex>.
|proof=
<tex>\langle q, \alpha\beta \rangle \vdash^* \langle p, \beta \rangle \vdash^* \langle r, \varepsilon \rangle.</tex>
}}
=== Автоматные языки ===
{{Определение
|definition=
Множество <tex>L(\mathcal{A})=\{\alpha| \mid \exists t \in T : \langle s, \alpha \rangle \vdash^* \langle t, \varepsilon \rangle t \in T\}</tex> --- язык называется '''языком автомата ''' (англ. ''automata's language'') <tex>\mathcal{A}</tex>.
}}
Иначе говоря, языком автомата является множество всех допускаемых им слов. Произвольный язык является автоматным, если существует ДКА, допускающий те и только те слова, которые принадлежат языку.
 
{{Определение
|definition=
Множество языков всех ДКА образует множество '''автоматных языков''' <tex>\mathrm{AUT}</tex>.
}}
 
== Изоморфизм двух автоматов ==
{{Определение
|definition=
Автоматы называются '''изоморфными''' (англ. ''isomorphic''), если существует [[Отображения | биекция]] между их вершинами такая, что сохраняются все переходы, терминальные состояния соответствуют терминальным, а начальные {{---}} начальным.
}}
{{Задача
|definition=
Задано два детерминированных конечных автомата. Определить, изоморфны ли они друг другу.
Гарантируется, что все состояния автоматов достижимы.
}}
 
=== Алгоритм ===
Из определения следует, что если автоматы изоморфны, то можно их состояния занумеровать одним способом так, что вершины из разных автоматов с одинаковыми номерами будут равны — то есть в каждом из этих двух состояний существует переход в какое-то состояние с таким же номером, что и переход по этой же букве в другом состоянии. Поэтому мы можем зафиксировать какую-то нумерацию, например, в порядке [[Обход в глубину, цвета вершин | обхода в глубину]] по символам в лексикографическом порядке и просто проверить состояния с одинаковыми номерами на равенство. Если все состояния будут равны, то автоматы будут равны, в нашем случае будет следовать изоморфизм двух автоматов. Асимптотика алгоритма совпадает с асимптотикой обхода в глубину, то есть <tex>O(N + M) </tex>, где <tex> N</tex> {{---}} суммарное число вершин в автоматах, <tex> M</tex> {{---}} суммарное число ребер.
 
=== Псевдокод ===
* <tex> \mathtt {Transitions} </tex> {{---}} множество пар <tex>\langle a</tex>, <tex>T \rangle</tex> , где <tex> a \in \Sigma</tex>, <tex>T \in Q</tex>
* <tex> \mathtt {Assotiations} </tex> {{---}} массив, где каждому состоянию первого автомата соответствует найденное состояние второго автомата.
'''boolean''' dfs(u: '''Vertex''', v: '''Vertex'''):
visited[u] = ''true'' <font color="green">// заметим, что достаточно только одного массива <tex>\mathtt{visited}</tex> на два автомата</font>
'''if''' (v.terminal '''!=''' u.terminal)
'''return''' ''false''
associations[u] = v
'''boolean''' result = ''true''
'''for''' (<tex>\langle c, q \rangle</tex> : u.transitions)
'''Vertex''' t1 = u.transitions.getVertex(c)
'''Vertex''' t2 = v.transitions.getVertex(c)
'''if''' одна из вершин t1, t2 ''дьявольская'', а другая {{---}} нет
'''return''' ''false''
'''if''' (visited[t1])
result = result '''and''' t2 '''==''' associations[t1]
'''else'''
result = result '''and''' dfs(t1, t2)
'''return''' result
 
== См. также ==
* [[Недетерминированные конечные автоматы]]
* [[Автомат Кнута-Морриса-Пратта]]
* [[Суффиксный автомат]]
* [[Алгоритм Ахо-Корасик]]
* [[Теорема Клини (совпадение классов автоматных и регулярных языков)]]
 
== Источники информации==
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — М.:Издательский дом «Вильямс», 2002. — С. 61.— ISBN 5-8459-0261-4
* ''Lawson, Mark V. (2004). Finite automata''. Chapman and Hall/CRC. ISBN 1-58488-255-7.
* [[wikipedia:Deterministic finite automaton | Wikipedia {{---}} Deterministic finite automaton]]
 
[[Категория: Теория формальных языков]]
[[Категория: Автоматы и регулярные языки]]
1632
правки

Навигация