Опубликован: 23.07.2006 | Доступ: свободный | Студентов: 2215 / 889 | Оценка: 4.28 / 4.17 | Длительность: 21:37:00
Специальности: Системный архитектор
Лекция 4:

Теория языков

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

Имеет место следующая теорема: если L = L(M) для некоторого недетерминированного конечного автомата М , то L = L(M') для некоторого детерминированного автомата M'.

Эта теорема доказывается конструктивным образом, т.е. путем указания общего алгоритма построения детерминированного автомата M', определяющего тот же язык, что и M. Пусть М = (Q, \Sigma , \delta , q_{0}, F) ; тогда мы определим М' = (Q', \Sigma , \delta ', {q}'_0 , F') следующим образом:

  • Q' совпадает с множеством состояний автомата М
  • {q}'_0 =q_{0}
  • F' = \{S\in Q\vert S\cap F\ne 0\}
  • \delta '(S, a) = S' для всех S\subseteq Q, где S' = {\{} p \vert \delta (q, a) содержит p для некоторого q\in S{\}}

Можно показать, что М' задает тот же язык, что и M. Таким образом, классы языков, задаваемых детерминированными и недетерминированными конечными автоматами, полностью совпадают. Естественно, детерминированные конечные автоматы удобнее, и в дальнейшем мы будем иметь дело только с ними. Следующий набросок программы демонстрирует моделирование конечного автомата (предполагается, что входная лента заканчивается символом end_of_file ):

q = q0;
c = GetChar();
while (c != eof) {
  q = move (q, c);
  c = GetChar();
}
if (q is in F) return "yes";
else return "no";

Эквивалентность конечных автоматов

Определение.Два автомата М_{1}= (Q_{1}, \Sigma , \delta _{1}, q_{10}, F_{1}) и М_{2} = (Q_{2}, \Sigma , \delta _{2}, q_{20}, F_{2}) называются эквивалентными, если они распознают один и тот же язык над алфавитом \Sigma .

Определение.Два состояния s_{i} и s_{j} называются эквивалентными, если \forall x\in \Sigma ^\ast верно, что \delta \,(q_i , x) \in F \Leftrightarrow \delta (q_j , x)\,\in F. Очевидно, что если два состояния s_{i} и s_{j} эквивалентны, то \forall a \in \Sigma состояния \delta (s_i , a) и \delta (s_j, a) также эквивалентны

Кроме того, так как в детерминированном конечном автомате переход {\delta (q,\varepsilon ) } может возникнуть только для конечного состояния q, то никакое заключительное состояние не может быть эквивалентно незаключительному состоянию. Таким образом, если мы предположим, что начальные состояния автоматов эквивалентны, то мы можем получить и другие пары эквивалентных состояний. Если в одну из таких пар попадет заключительное состояние вместе с незаключительным, то s_{i} и s_{j} неэквивалентны. Напишем алгоритм разбиения множества состояний на классы эквивалентности:

Добавить  (q10, q20) в Список;
Список = 0; /* Множество эквивалентных множеств */
for each (q in Q1+Q2) { Добавить {s} в Список; }
while (есть пара (qi, qj), входящая в Список) {
   Удалить пару (qi, qj) из Списка;
   Пусть A и A'  - такие множества, что q_i \;\in \;A и q_j \;\in \;{A}' ;
   if (A != A') {
      A = A + A';
      for ( a from  \Sigma ) { Добавить ( \delta \;(q_i ,\;a),\;\delta ;(q_j,\;a))
   в Список; }
   }
}

Таким образом, мы получим разбиение множества Q_1 \cup Q_2 на множества эквивалентных состояний, если q_{10} и q_{20} - эквивалентны. Теперь осталось проверить, что никакое из этих множеств не содержит заключительное и незаключительное соcтояния. Если это верно, то автоматы эквивалентны.

Минимизация конечного автомата

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

Определение. Будем говорить, что строка w различает состояния s и t, если существует такая входная цепочка w, что \delta (s,w) является заключительным состоянием, а состояние \delta (t,w) не является заключительным состоянием, или, наоборот, \delta (s,w) не является заключительным состоянием, а состояние \delta (t,w) является заключительным состоянием.

Очевидно, что если некоторая строка w различает состояния t_{1} и t_{2 } такие, что t_{1}=\delta (q_{1}, \quad a) и t_{2 }=\delta (q_{2}, a) , то строка aw различает состояния q_{1} и q_{2}

Теперь перейдем к описанию процесса минимизации конечного автомата. Мы начнем с поиска и удаления всех недостижимых состояний. Затем мы должны найти такое разбиение множества состояний автомата, чтобы каждое подмножество содержало неразличимые состояния, т.е. если s и t принадлежат некоторому подмножеству, то для всех a из \Sigma  \quad \delta (s,a) и \delta (t,a) также принадлежат этому подмножеству.

Для этого мы разобьем множество состояний на два подмножества: F и S-F. В дальнейшем, мы попытаемся разбить каждое из подмножеств, соблюдая указанное выше условие. Если возникает ситуация, при которой мы не можем разбить никакое множество состояний, то мы заканчиваем процесс разбиения. В результате мы получим некоторый набор множеств состояний S_{1}{,{\ldots},S}_{k}. Каждое из S_{i} содержит только неразличимые состояния. Наконец, внесем в множество состояний минимизированного автомата по одному представителю каждого из множеств S_{i}. На этом процесс завершается.

На следующем слайде мы приведем пример минимизации автомата.

Пример минимизации конечного автомата


Рассмотрим процесс минимизации автомата, представленного на слайде. Согласно алгоритму, вначале мы произведем удаление недостижимых состояний - в нашем примере состояние F очевидно недостижимо и потому не попадет в минимизированный автомат.

Затем мы произведем разбиение множества состояний автомата на классы эквивалентности. Укажем такую последовательность разбиений:

  1. E, ABCD
  2. E, ABC, D, так как \delta (D,b) = E.
  3. E, AC, B, D, так как \delta(B,b) = D.

Таким образом, состояния A и C неразличимы. Поэтому получаем следующий автомат: