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

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

Распознаватели для различных классов грамматик

Под распознавателем мы будем понимать обобщенный алгоритм, позволяющий определить некоторое множество (в нашем случае - язык) и использующий в своей работе следующие компоненты: входную ленту, управляющее устройство с конечной памятью и дополнительную рабочую память. Обычно считается, что управляющее устройство может только читать информацию, записанную на входной ленте (чтение производится с помощью входной головки, указывающей на текущий символ) и продвигаться по ней вперед и, возможно, назад. Распознаватель также может изменять состояние памяти, которая может быть организована как конечный линейный список ячеек или как стек (в русской литературе называемый также магазином). В качестве примеров распознавателей можно назвать машину Тьюринга, конечные и магазинные автоматы, которые должны быть известны студентам из предыдущих курсов.

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

Оказывается, каждому классу грамматик из иерархии Хомского соответствует класс распознавателей, определяющий тот же класс языков:

  • Язык L праволинейный тогда и только тогда, когда он определяется (односторонним детерминированным) конечным автоматом
  • Язык L контекстно-свободный тогда и только тогда, когда он определяется (односторонним недетерминированным) автоматом с магазинной памятью
  • Язык L контекстно-зависимый тогда и только тогда, когда он определяется (двусторонним недетерминированным) автоматом с магазинной памятью
  • Язык L рекурсивно перечислимый тогда и только тогда, когда он определяется машиной Тьюринга (этими понятиями мы оперировать не будем; формально они определяются в курсе "Вычислимость" или в базовом курсе "Компьютерные науки").

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

Конечные автоматы

Конечный автомат - это один из самых простых механизмов, используемых при работе с языками. У этого распознавателя есть только фиксированный набор ячеек памяти, а управляющее устройство может только сдвигаться вправо по входной ленте и изменять состояния памяти. Основная часть конечного автомата - это функция перехода, определяющая возможные переходы для любого текущего состояния и любого входного символа. Подразумевается, что допускается возможность перехода сразу в несколько различных состояний автомата, т.е. управляющее устройство распознавателя может быть и недетерминированным. Недетерминированность надо понимать следующим образом: если возможно сразу несколько переходов из данного состояния, то создается несколько копий нашего автомата, по одному на каждое новое состояние. Цепочка считается принадлежащей языку, если хотя бы одна из последовательностей шагов завершается в заключительном состоянии.

После такого краткого объяснения основных идей мы можем дать формальное определение конечного автомата.

Определение. Конечный автомат - это пятерка M = (Q, \Sigma , \delta , q_{0}, F) , где

  • Q - конечное множество состояний
  • \Sigma - конечное множество допустимых входных символов
  • \delta - отображение множества Q \times {\Sigma } в множество P(Q) , определяющее поведение управляющего устройства (эту функцию часто называют функцией переходов)
  • q_0 \in Q - начальное состояние управляющего устройства
  • F\subseteq Q - множество заключительных состояний

В принципе, для определения последующих действий конечного автомата достаточно знать текущее состояние управляющего устройства плюс последовательность все еще необработанных символов на входной ленте. Этот набор данных называется конфигурацией автомата.

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

Определим детерминированный конечный автомат как частный случай общего (недетерминированного) конечного автомата и введем некоторые дополнительные определения и соглашения, которые пригодятся нам в дальнейшем:

Определение. Автомат называется детерминированным, если множество \delta (q, a) содержит не более одного состояния для любых q, a. Если \delta (q, a) всегда содержит ровно одно состояние (т.е. не имеет неопределенных переходов), то автомат называется полностью определенным .

Определение. Слово w = a_{1}{{\ldots}a}_{k} над алфавитом \Sigma допускается конечным автоматом M = (Q, \Sigma , \delta , q_{0}, F) , если существует последовательность состояний q_{1}, q_{2}, ..., q_{n} такая, что q_{1}=q_{0}, q_n \in Fи для \forall i\forall j:\;1\le i<n,\;1\le j<k\quad \delta \;(q_i ,\;a_j )=q_{i+1}.

Определение. Язык L распознается конечным автоматом, если каждое слово языка L допускается этим конечным автоматом.

Обозначение. Конечные автоматы удобно иллюстрировать с помощью диаграмм переходов , см. примеры ниже (двойным кружком обозначены конечные состояния):

Автомат, распознающий язык (aa^{*}\vert bb^{*}): Автомат, распознающий язык (a\vert b)^{*}abb: