Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[01] Соколов В.А. Формальные языки и грамматики....doc
Скачиваний:
96
Добавлен:
29.10.2018
Размер:
1.44 Mб
Скачать

Лекция 6 Регулярные выражения и регулярные грамматики Регулярные грамматики

Определение 6.1.

Грамматика G = (N, T, S, P) называется праволинейной, если все продукции имеют вид

A   B

A   , где А, ВN,   T*.

Аналогично грамматика называется леволинейной, если все продукции имеют вид

AB

A  .

Грамматика называется регулярной, если она или праволинейная, или леволинейная.

Язык назовем регулярным, если он порождается некоторой регулярной грамматикой.

Пример 6.2.

G1 = ({S}, {a, b}, S, P)

SabSa

Пример 6.3.

= ({SAB}, {ab}, SP)

S A

AaB

BAb

Грамматика G – линейная, но не регулярная.

Заметим, что при выводе сентенциальных форм в праволинейной грамматике эти формы будут иметь вид ab . . . cD.

Пусть к этой сентенциальной форме применяется продукция

DdE,

т.е. имеем в G:

ab ... cDab ... cd E.

Этому шагу в выводе можно сопоставить такт работы НКА М, который из состояния D, прочитав символ d, переходит в состояние Е:

d

D E

Тогда, очевидно, выводу в G соответствует путь в диаграмме переходов автомата М, и наоборот.

Теорема 6.4.

Пусть G = (N, T, S, P) – праволинейная грамматика. Тогда L(G) – автоматный язык.

Доказательство.

Положим N = {А0, А1, ...}, S = А0 и допустим, что продукция имеет вид

А0  1Аi ,

Аi  2Аj ,

. . . . . . . . . .

Аn  l. .

Если   L(G), тогда, в силу вида продукций G, вывод должен иметь вид:

А0  1Аi  12Аj * 12 ... k Аn 12 ... kl = . (6.5)

Соответствующий автомат будет воспроизводить вывод, поглощая по очереди каждую i.

Начальное состояние автомата – А0, а для каждой переменной Аi он будет иметь нефинальное состояние, помеченное буквой Аi .

Для каждой продукции вида

Аi a1a2 ... amАj

автомат будет иметь переходы, связывающие вершины Аi и Аj , т.е. функция переходов  будет определена так, что

*( Аi , а1а2 . . . аm) = Аj.

Для каждой продукции вида

Аi a1a2 ... am

соответствующий переход

*(Аi , а1а2 . . . аm) = Аf ,

где Аf – финальное состояние.

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

Допустим, что   L(G) и (6.5) имеет место. Тогда, по построению НКА, в диаграмме переходов есть путь из А0 в Аi , помеченный 1, путь из Аi в Аj , помеченный 2 и т.д., откуда ясно, что

Аf  *(А0, ),

т.е.  допускается автоматом М.

Обратно, пусть  допустима М. В силу построения М, допустить  – это пройти через последовательность состояний А0, Аi, ... до Аf, используя пути, помеченные 1, 2, ... . Таким образом,  должна иметь вид

 = 12 . . . кl,

следовательно, возможен вывод

А0  1Аi  12Аj * 12 ... k Аn 12 ... kl L(G).

Пример 6.6.

Построить автомат, допускающий язык, порожденный грамматикой

А0 аА1

А1аbА0b

a b

А0 А1 Аf

b a

Теорема 6.7.

Если L – автоматный язык в алфавите , тогда существует праволинейная грамматика G = (N, T, S, P) такая, что L = L(G).

Доказательство.

Пусть М – ДКА, допускающий L,

M = (Q, , , q0, F).

Предположим, что Q = {q0, q1, . . ., qn}, = {a1, a2, . . ., am}. Построим праволинейную грамматику G = (N, , S, P), где N = {q0, q1, . . ., qn}, S = q0.

Для каждого перехода в ДКА М

(qi, aj) = qk

мы помещаем в Р продукцию qiajqk.

В дополнение к этому, если qkF, то мы добавляем в Р еще продукцию qk  .

Покажем вначале, что так определенная грамматика G порождает любую строку из L. Пусть   L и  = ai aj . . . akal .

Для M принять  означает совершить переходы:

(q0, ai) = qp

(qp, aj) = qr

. . .

(qs, ak) = qt

(qt, al) = qf, qfF.

По построению, грамматика G будет иметь одну продукцию (как минимум) для каждого из этих соотношений. Поэтому можно построить в G вывод:

q0 aiqpaiajqr aiaj ... akq taiaj ... akalqfaiaj ... akal, (6.8)

следовательно,   L(G).

Обратно, если   L(G), то ее вывод имеет вид (6.8), но это влечет соотношение *(q0, aiaj ... akal) = qf, т.е.   L(M).

Пример 6.9.

Построить праволинейную грамматику для L(aab*a).

По выражению aab*a построим соответствующий НКА M:

a a a

q0 q1 q2 qf

b

В данном случае НКА совпадает с ДКА. Как показано выше, имеем соответствие между М и искомой грамматикой G:

M G

(q0, a) = q1; q0aq1

(q1, a) = q2; q1aq2

(q2, b) = q2; q2bq2

(q2, a) = qf, qfF; q2aqf, qf  .

Тогда, к примеру, строка aaba будет иметь вывод в G:

q0 aq1aaq2aabq2aabaqfaaba.

Аналогично нетрудно доказать следующую теорему:

Теорема 6.10.

Язык L - автоматный тогда и только тогда, когда существует леволинейная грамматика G такая, что L = L(G).

Объединяя, получаем:

Теорема 6.11.

Язык L - автоматный тогда и только тогда, когда существует регулярная грамматика G такая, что L = L(G).

Таким образом, любой автоматный язык является регулярным и наоборот.