Дискуссионный математический форумМатематический форум

Математический форум Math Help Planet

Обсуждение и решение задач по математике, физике, химии, экономике

Теоретический раздел
Часовой пояс: UTC + 4 часа [ Летнее время ]
MathHelpPlanet.com RSS-лента Математического форума

Часовой пояс: UTC + 4 часа [ Летнее время ]


Детерминизация конечных автоматов

Детерминизация конечных автоматов


Для дальнейшего изучения свойств конечных автоматов и, в частности, для решения задачи синтеза важное значение имеет следующая теорема.


Теорема 7.7 (теорема о детерминизации). Для любого конечного автомата может быть построен эквивалентный ему детерминированный конечный автомат.


Для того чтобы доказать теорему, нужно, во-первых, описать алгоритм построения детерминированного конечного автомата по исходному; во-вторых, обосновать этот алгоритм, строго доказав, что он действительно дает конечный автомат, который является детерминированным и эквивалентным исходному. Здесь мы приведем только сам алгоритм построения детерминированного автомата.


Преобразование произвольного конечного автомата к эквивалентному детерминированному осуществляется в два этапа: сначала удаляются дуги с меткой [math]\lambda[/math], затем проводится собственно детерминизация.


1. Удаление λ-переходов (дуг с меткой [math]\lambda[/math]).


Чтобы перейти от исходного конечного автомата [math]M=(V,Q,q_0,F,\delta)[/math] к эквивалентному конечному автомату [math]M'=(V,Q',q_0,F',\delta')[/math] без λ-переходов, достаточно в исходном графе [math]M[/math] проделать следующие преобразования.


а. Все состояния, кроме начального, в которые заходят только дуги с меткой [math]\lambda[/math], удаляются; тем самым определяется множество [math]Q'[/math] конечного автомата [math]M'[/math]. Понятно, что [math]Q'\subseteq Q[/math]. При этом полагаем, что начальное состояние остается прежним.


Множество дуг конечного автомата и их меток

б. Множество дуг конечного автомата [math]M'[/math] и их меток (тем самым и функция переходов [math]M'[/math]) определяется так: для любых двух состояний [math]p,r\in Q',~ p\to_{a}r[/math] имеет место тогда и только тогда, когда [math]a\in V[/math], а в графе [math]M[/math] имеет место одно из двух: либо существует дуга из [math]p[/math] в [math]r[/math], метка которой содержит символ [math]a[/math], либо существует такое состояние [math]q[/math], что [math]p\Rightarrow_{\lambda}^{+}q[/math] и [math]q\to_{a}r[/math]. При этом вершина [math]q[/math], вообще говоря, может и не принадлежать множеству [math]Q'[/math], т.е. она может и исчезнуть при переходе к автомату [math]M'[/math] (рис. 7.11). Если же [math]q\in Q'[/math], то, естественно, в [math]M'[/math] сохранится дуга [math](q,r)[/math] и символ [math]a[/math] будет одним из символов, принадлежащих метке этой дуги (рис. 7.12).


Множество заключительных состояний конечного автомата

Таким образом, в [math]M'[/math] сохраняются все дуги [math]M[/math], метки которых отличны от [math]\lambda[/math] и которые соединяют пару (вершин) состояний из множества [math]Q'[/math] (не удаляемых согласно п. а). Кроме этого, для любой тройки состояний [math]p,q,r[/math] (не обязательно различных!), такой, что [math]p,r\in Q'[/math] и существует путь ненулевой длины из [math]p[/math] в [math]q[/math], метка которого равна [math]\lambda[/math] (т.е. путь по λ-переходам), а из [math]q[/math] в [math]r[/math] ведет дуга, метка которой содержит символ [math]a[/math] входного алфавита, в [math]M'[/math] строится дуга из [math]p[/math] в [math]r[/math], метка которой содержит символ [math]a[/math] (см. рис. 7.11).


в. Множество заключительных состояний [math]F'[/math] конечного автомата [math]M'[/math] содержит все состояния [math]q\in Q'[/math], т.е. состояния конечного автомата [math]M[/math], не удаляемые согласно п. а, для которых имеет место [math]q\Rightarrow_{\lambda}^{\ast}q_f[/math] для некоторого [math]q_f\in F[/math] (т.е. либо состояние [math]q[/math] само является заключительным состоянием конечного автомата [math]M[/math], либо из него ведет путь ненулевой длины по дугам с меткой [math]\lambda[/math] в одно из заключительных состояний конечного автомата [math]M[/math]) (рис. 7.13).


2. Собственно детерминизация.


Пусть [math]M=(Q,V,q_0,F,\delta)[/math] — конечный автомат без λ-переходов. Построим эквивалентный [math]M[/math] детерминированный конечный автомат [math]M_1[/math].


Этот конечный автомат определяется таким образом, что его множество состояний есть множество всех подмножеств множества состояний конечного автомата [math]M[/math]. Это значит, что каждое отдельное состояние конечного автомата [math]M_1[/math] определено как некоторое подмножество множества состояний конечного автомата [math]M[/math]. При этом начальным состоянием нового конечного автомата (т.е. [math]M_1[/math]) является одноэлементное подмножество, содержащее начальное состояние старого конечного автомата (т.е. [math]M[/math]), а заключительными состояниями нового конечного автомата являются все такие подмножества [math]Q[/math], которые содержат хотя бы одну заключительную вершину исходного конечного автомата [math]M[/math].


Впредь, допуская некоторую вольность речи, мы будем иногда называть состояния конечного автомата [math]M_1[/math] состояниями-множествами. Важно, однако, четко усвоить, что каждое такое состояние-множество есть отдельное состояние нового конечного автомата, но никак не множество его состояний. В то же время для исходного ("старого") конечного автомата [math]M[/math] это именно множество его состояний. Образно говоря, каждое подмножество состояний старого конечного автомата "свертывается" в одно состояние нового конечного автомата*.


*Формально следовало бы определить множество [math]Q_1[/math] как множество, находящееся во взаимно однозначном соответствии с множеством [math]2^Q[/math], но нам все-таки удобнее считать, что [math]Q_1[/math] совпадает с [math]2^Q[/math], — ведь множеством состояний конечного автомата может быть любое непустое конечное множество.


Функция переходов нового конечного автомата определена так, что из состояния-множества [math]S[/math] по входному символу а конечный автомат [math]M_1[/math] переходит в состояние-множество, представляющее собой объединение всех множеств состояний старого конечного автомата, в которые этот старый конечный автомат переходит по символу а из каждого состояния множества [math]S[/math]. Таким образом, конечный автомат [math]M_1[/math] является детерминированным по построению.


Приведенное выше словесное описание можно перевести в формулы следующим образом: строим конечный автомат [math]M_1[/math] так, что


[math]M_1=(Q_1,V,\{q_0\},F_1,\delta_1)[/math], где

[math]\begin{cases}Q_1=2^Q,\quad F_1=\{T\colon\, T\cap F\ne\varnothing,~T\in2^Q\},\\ (\forall S\subseteq Q)(\forall a\in V)\Bigl(\delta_1(S,a)= \bigcup\limits_{q\in S}\delta(q,a)\Bigr). \end{cases}[/math]
(7.8)

Обратим внимание на то, что среди состояний нового конечного автомата есть состояние [math]\varnothing[/math], причем, согласно (7.8), [math]\delta_1(\varnothing,a)=\varnothing[/math] для любого входного символа [math]a[/math]. Это значит, что, попав в такое состояние, конечный автомат [math]M_1[/math] уже его не покинет. Вообще же любое состояние [math]q[/math] конечного автомата, такое, что для любого входного символа [math]a[/math] имеем [math]\delta(q,a)=q[/math], называют поглощающим состоянием конечного автомата. Таким образом, состояние [math]\varnothing[/math] детерминированного конечного автомата [math]M_1[/math] является поглощающим. Полезно заметить также, что [math]\delta_1(S,a)=\varnothing[/math] тогда и только тогда, когда для каждого [math]q\in S[/math] (состояния старого конечного автомата из множества состояний [math]S[/math]) [math]\delta(q,a)=\varnothing[/math], т.е. в графе [math]M[/math] из каждого такого состояния [math]q[/math] не выходит ни одна дуга, помеченная символом [math]a[/math].


Можно доказать, что полученный по такому алгоритму конечный автомат эквивалентен исходному.




Пример 7.9. Детерминизируем конечный автомат, изображенный на рис. 7.14.


Эквивалентный конечный автомат без λ-переходов изображен на рис. 7.15. Заметим, что вершина [math]q_2[/math] исчезает, так как в нее заходят только "пустые" дуги.


Конечный и эквивалентный конечный автоматы

Чтобы детерминизировать полученный автомат, совершенно не обязательно выписывать все его [math]2^3=8[/math] состояний, среди которых многие могут оказаться не достижимыми из начального состояния [math]\{q_0\}[/math]. Чтобы получить достижимые из [math]\{q_0\}[/math] состояния, и только их, воспользуемся так называемым методом вытягивания.


Этот метод в общем случае можно описать так.


В исходном конечном автомате (без пустых дуг) определяем все множества состояний, достижимых из начального, т.е. для каждого входного символа [math]a[/math] находим множество [math]\delta(q_0,a)[/math]. Каждое такое множество в новом автомате является состоянием, непосредственно достижимым из начального.


Для каждого из определенных состояний-множеств [math]S[/math] и каждого входного символа [math]a[/math] находим множество [math]\textstyle{\mathop{\bigcup\limits_{q\in S} \delta(q,a)}\limits^{\phantom{A}^{.}}}[/math]. Все полученные на этом шаге состояния будут состояниями нового (детерминированного) автомата, достижимыми из начальной вершины по пути длины 2. Описанную процедуру повторяем до тех пор, пока не перестанут появляться новые состояния-множества (включая пустое!). Можно показать, что при этом получаются все такие состояния конечного автомата [math]M_1[/math], которые достижимы из начального состояния [math]\{q_0\}[/math].


Граф для языка

Для конечного автомата на рис. 7.15 имеем:


[math]\begin{aligned}& \delta_1(\{q_0\},a)=\{q_1\};\qquad \delta_1(\{q_0\},b)=\{q_1,q_3\};\\ & \delta_1(\{q_1\},a)=\{q_1\};\qquad \delta_1(\{q_1\},b)=\{q_1\};\\ & \delta_1(\{q_1,q_3\},a)= \delta(q_1,a)\cup \delta(q_3,a)= \{q_1\}\cup\{q_1\}=\{q_1\};\\ & \delta_1(\{q_1,q_3\},b)= \delta(q_1,b)\cup \delta(q_3,b)= \{q_1\}\cup\{q_1\}=\{q_1\}. \end{aligned}[/math]

Так как новых состояний-множеств больше не появилось, процедура "вытягивания" на этом заканчивается, и мы получаем граф, изображенный на рис. 7.16.




Дополнение регулярного языка


Одним из важных теоретических следствий теоремы о детерминизации является следующая теорема.


Теорема 7.8. Дополнение регулярного языка есть регулярный язык.


Пусть [math]L[/math] — регулярный язык в алфавите [math]V[/math]. Тогда дополнение языка [math]L[/math] (как множества слов) есть язык [math]\overline{L}=V^{\ast}\setminus L[/math].


Согласно теореме 7.7, для регулярного языка [math]L[/math] может быть построен детерминированный конечный автомат [math]M[/math], допускающий [math]L[/math]. Поскольку в детерминированном автомате из каждой вершины по каждому входному символу определен переход в точности в одну вершину, то, какова бы ни была цепочка [math]x[/math] в алфавите [math]V[/math], для нее найдется единственный путь в [math]M[/math], начинающийся в начальном состоянии, на котором читается цепочка [math]x[/math]. Ясно, что цепочка [math]x[/math] допускается автоматом [math]M[/math], то есть [math]x\in L(M)[/math], тогда и только тогда, когда последнее состояние указанного пути является заключительным. Отсюда следует, что цепочка [math]x\notin L(M)[/math] тогда и только тогда, когда последнее состояние указанного пути не заключительное. Но нам как раз и нужен конечный автомат [math]M'[/math], который допускает цепочку [math]x[/math] тогда и только тогда, когда ее не допускает исходный конечный автомат [math]M[/math]. Следовательно, превращая каждое заключительное состояние [math]M[/math] в не заключительное и наоборот, получим детерминированный автомат, допускающий дополнение языка [math]L[/math].


Доказанная теорема позволяет строить конечный автомат, не допускающий определенное множество цепочек, следующим методом: строим сначала автомат, допускающий данное множество цепочек, затем детерминизируем его и переходим к автомату для дополнения так, как это указано в доказательстве теоремы 7.8.




Пример 7.10. а. Построим конечный автомат, допускающий все цепочки в алфавите [math]\{0;1\}[/math], кроме цепочки 101.


Сначала построим конечный автомат, допускающий единственную цепочку 101. Этот автомат приведен на рис. 7.17.


Конечный автомат, допускающий единственную цепочку 101

Этот автомат квазидетерминированный, но не детерминированный, так как он не полностью определен. Проведем его детерминизацию и получим детерминированный эквивалентный конечный автомат, изображенный на рис. 7.18.


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

И наконец, переходя к дополнению (и переименовывая состояния), получим автомат, изображенный на рис. 7.19.


Обратим внимание, что в полученном автомате все вершины, кроме вершины [math]s_3[/math], являются заключительными.


Заметим также, что переход к дополнению, о котором идет речь в доказательстве теоремы 7.8, может быть проведен только в детерминированном автомате. Если бы мы поменяли ролями заключительные и незаключительные вершины в автомате, изображенном на рис. 7.17, то получили бы автомат, допускающий язык [math]\{\lambda,1,10\}[/math], который не является — как нетрудно сообразить — множеством всех цепочек, отличных от цепочки 101.


Отметим также, что конечный автомат на рис. 7.19 допускает все цепочки, содержащие вхождение цепочки 101, но не совпадающие с самой этой цепочкой. Вот, например, путь, несущий цепочку 1011: [math]s_0,s_1,s_2,s_3,t[/math].


б. Построим конечный автомат, допускающий все цепочки в алфавите [math]\{0;1\}[/math], кроме тех, которые содержат вхождение цепочки 101. Рассмотрим язык [math]L[/math], каждая цепочка которого содержит вхождение цепочки 101. Его можно задать так:


[math]L=(0+1)^{\ast}101(0+1)^{\ast}.[/math]

Нам нужно построить автомат для дополнения языка [math]L[/math].


Непосредственно по регулярному выражению в этом случае легко построить конечный автомат, допускающий язык [math]L[/math] (рис. 7.20).


Конечный автомат, допускающий язык L

Затем методом "вытягивания" проведем детерминизацию. Результат детерминизации представлен на рис. 7.21.


Детерминизация конечного автомата, допускающего язык L

Для полного решения задачи осталось только на рис. 7.21 поменять ролями заключительные и не заключительные вершины (рис. 7.22).


Изменение вершин в конечном автомате, допускающего язык L

в. Обсудим идею построения конечного автомата, допускающего те и только те цепочки в алфавите [math]\{0;1\}[/math], которые не начинаются цепочкой 01 и не заканчиваются цепочкой 11 (т.е. не разрешаются цепочки вида [math]01x[/math] и цепочки вида [math]y11[/math], каковы бы ни были цепочки [math]x,y\in\{0;1\}[/math]).


В этом случае дополнением языка, для которого нужно построить конечный автомат, является множество всех таких цепочек нулей и единиц, которые начинаются цепочкой 01 или заканчиваются цепочкой 11. Допускающий это множество цепочек автомат строится как автомат для объединения [math]01(0+1)^{\ast}+(0+1)^{\ast}11[/math] тем способом, который изложен при доказательстве теоремы Клини (см. теорему 7.6).




Из свойства замкнутости класса регулярных языков относительно дополнения (см. теорему 7.8) немедленно вытекает замкнутость этого класса относительно пересечения, теоретико-множественной и симметрической разности.


Следствие 7.3. Для любых двух регулярных языков [math]L_1[/math] и [math]L_2[/math] справедливы следующие утверждения:


1) пересечение [math]L_1\cap L_2[/math] регулярно;
2) разность [math]L_1\setminus L_2[/math] регулярна;
3) симметрическая разность [math]L_1\vartriangle L_2[/math] регулярна.

Справедливость утверждений вытекает из тождеств:


[math]\begin{aligned} &{\scriptstyle{\mathsf{1)}}}\quad L_1\cap L_2= \overline{\overline{L_1} \cup\overline{L_2}}\,;\\[2pt] &{\scriptstyle{\mathsf{2)}}}\quad L_1\setminus L_2= L_1\cap \overline{L_2}\,;\\[2pt] &{\scriptstyle{\mathsf{3)}}}\quad L_1\,\triangle\,L_2 = (L_1\cup L_2)\setminus (L_1\cap L_2).\end{aligned}[/math]


Во-первых, полученные результаты позволяют утверждать, что класс регулярных языков относительно операций объединения, пересечения и дополнения является булевой алгеброй, в которой единицей служит универсальный язык, а нулем — пустой язык. Во-вторых, эти алгебраические свойства семейства регулярных языков позволяют решить важную проблему распознавания эквивалентности двух произвольных конечных автоматов.


Согласно определению 7.10, конечные автоматы эквивалентны, если допускаемые ими языки совпадают. Поэтому, чтобы убедиться в эквивалентности автоматов [math]M_1[/math] и [math]M_2[/math], достаточно доказать, что симметрическая разность языков [math]L(M_1)[/math] и [math]L(M_2)[/math] пуста. Для этого, в свою очередь, достаточно построить автомат, допускающий эту разность, и убедиться в том, что допускаемый им язык пуст. В общем случае проблему распознавания того, что язык конечного автомата пуст, называют проблемой пустоты для конечного автомата. Чтобы решить эту проблему, достаточно найти множество заключительных состояний автомата, достижимых из начального состояния. Так как конечный автомат — это ориентированный граф, то решить такую проблему можно, например, с помощью, поиска в ширину. Язык, допускаемый конечным автоматом, пуст тогда и только тогда, когда множество заключительных состояний, достижимых из начального состояния, пусто. Практически эквивалентность конечных автоматов предпочтительнее распознавать, используя алгоритм минимизации, но сейчас нам важно подчеркнуть, что принципиальная возможность решить проблему эквивалентности вытекает из теоремы 7.7 и ее алгебраических следствий.


Часовой пояс: UTC + 4 часа [ Летнее время ]


Яндекс.Метрика

Copyright © 2010-2016 MathHelpPlanet.com. All rights reserved