Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

XVYggbpFw2

.pdf
Скачиваний:
2
Добавлен:
15.04.2023
Размер:
2.31 Mб
Скачать

<Число> можно “устранить” нетерминал <Знак> в первом и остальных правилах заменить на два варианта “ + – ”, аналогично в третьем и остальных правилах заменить нетерминал <Цифра> на соответствующие терминалы. В результате получится эквивалентная регулярная грамматика.

Пример 11.2.

S <Буква>|<Буква><Слово>

<Слово> <Буква><Слово>|<Цифра><Слово>

<Цифра>

0|1 … |9

<Буква>

_|a|b|c … z|A|B|C … Z

Эта грамматика определяет регулярный язык идентификаторов.

Пример 11.3.

S <Слово>@<Конец>

<Конец> <Слово>.<Слово>|<Слово>.<Конец> <Слово> <Символ>|<Символ><Слово>

<Символ> -|_|a|b|c … z|A|B|C … Z|0|1… |9

Эта грамматика определяет язык правильных e-mail-адресов. На этот раз регулярность языка не так очевидна. Однако дальше мы убедимся, что и эта грамматика эквивалентна регулярной.

Упражнения

11.1. Доказать, что грамматика

S aB, B Sb, B b

не эквивалентна никакой регулярной грамматике.

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

a)

L = { an b an | n 0 };

b)

L = { an b am | n m 0 };

c)

L = { an bm | n m 0 };

d)

L = { an ba bn | n 0 }.

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

a)множество цепочек в алфавите {a, b}, в которых символ a не встречается два раза подряд;

b) L = { an bm | n, m 0 };

c) L = { (a b)m an | n, m 0 };

12.КОНЕЧНЫЕ АВТОМАТЫ

Вэтом параграфе строятся некоторые абстрактные вычислительные устройства (автоматы), которые в некотором естественном смысле по своим возможностям равносильны регулярным грамматикам. Грамматика – удобное средство описания языка. Но в силу присущей ей декларативности она не слишком удобна для прямого описания имеющегося языка. Автомат же, напротив, имеет ярко выраженный процедурный характер. Поэтому программировать его действия обычно гораздо проще.

Определение 12.1. Конечным автоматом называется объект

A = < Q,T, ,S,F>

где:

Q,T конечные непересекающиеся множества, :Q T P(Q) – функция,

S

Q,

F

Q.

Здесь:

Q T множество упорядоченных пар <A,t>, где A Q, t T (прямое или декартово произведение множеств);

P (Q) - множество всех подмножеств множества Q;

Функция : X

Y – это правило, сопоставляющее каждому элемен-

ту x X один элемент

(x) Y.

Множество Q называется множеством состояний. При этом элемент S Q называется начальным состоянием, а элементы из F называются

заключительными состояниями.

Функция - это, так называемая, функция переходов. Тот факт, что B (A,t) мы трактуем как высказывание:

”автомат A из состояния A, получив символ t, может перейти в состояние B”.

Символы алфавита T назовем терминальными. Их роль будет согласована с ролью терминалов в формальных грамматиках. Состояния подобны нетерминалам, но имеются тонкости.

Опишем работу автомата более точно.

1.Автомат осуществляет свою работу по шагам или тактам.

2.На каждом шаге он находится в одном из своих состояний (допус-

тим A Q).

3. Состояние S называется стартовым. С него начинается работа.

4.Перед каждым шагом “на входе” автомата имеется какое-то слово алфавита T (обрабатываемое слово). Шаг определен, если

слово - не пустое (

) и, одновременно, множество

(A, а) –

не пустое ( (A, а)

 

), где а – первая буква слова .

 

5. При условиях:

,

(A, а)

и представимо в виде

= а го-

ворим, что символ а (первая буква слова ) - воспринимается (обрабатывается) автоматом A на рассматриваемом шаге.

6.В результате выполнения одного шага автомат из состояния A переходит в одно из состояний B (A, а). После этого на входе он имеет слово .

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

< A ,

>

что произносится как:

 

“Автомат A в состоянии A имеет на входе слово ”

Описанный выше один шаг работы автомата изобразим в виде

< A, >

< B , >

Говорим, что цепочка воспринимается или распознается автома-

том A, если возможна ситуация, когда, получив на входе, автомат за-

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

< S , > = < A1 , 1> < A2 , 2 > < Ak , k > = < D, >

где D – одно из заключительных состояний.

Слово “возможно” в этом определении говорит о том, что работа автомата, имеющего на входе слово , может и не завершиться так удачно, как требуется. На каждом шаге переход к следующему состоянию осуществляется, вообще говоря, неоднозначно. Автомат может перейти в любое

из состояний B

(A, а). Утверждение “ воспринимается

означает,

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

заканчи-

вается и как раз в этот момент автомат переходит в одно из заключительных состояний.

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

Определение 12.2. Множество всех цепочек, воспринимаемых автоматом A, называется языком, определяемым или распознаваемым

этим автоматом, и обозначается как L(A). Некое множество слов

алфавита T называется автоматным языком, если оно совпадает с L(A) для некоторого автомата A.

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

Наличие ребра

означает, что B (A, а). S

Заключительные состояния изображаются в виде двойных кружков

Стартовое состояние помечается указывающей на него стрелочкой.

Если из одного состояния в другое выходит несколько ребер, помеченных разными буквами, то вместо них рисуется одно ребро, на котором

перечисляются все метки. Т.е. вместо

рисуется

.

Работу автомата, представленного графом, интерпретируют как работу некой механической каретки. Граф – это управляющее устройство каретки – программа. Каретка - это указатель, который перемещается по клеткам некой ленты. Лента вытянута в горизонтальном направлении и разбита на клетки. Есть начальная клетка слева, но вправо лента бесконечна:

На ленте от начальной клетки вправо записывается какое-нибудь терминальное слово – в одной клетке одна буква. Автомат работает по шагам. Каждый момент времени он находится в одном из своих состояний, а указатель – на одной из клеток ленты. Один шаг работы заключается в том,

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

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

Очевидно, что такое наглядное описание автомата равносильно приведенному в определении 12.1 и в последующих формальных конструкциях.

Автомат можно описать с помощью таблицы. Мы будем использовать следующий способ. Рисуем прямоугольную таблицу, строки которой помечаются состояниями, а столбцы – терминалами автомата. Строка, соответствующая стартовому состоянию, ставится на первое место. Один дополнительный столбец будет служить для пометки заключительных состояний. В клетке, помеченной состоянием A и терминалом а, перечисляются через запятую элементы множества (A, а). В последнем столбце заключительные состояния помечаются знаком ‘+’.

Пример 12.1. Рассмотрим автомат, определенный графом:

Этот автомат с помощью таблицы задается:

 

a

b

c

fin

S

A

 

 

 

A

 

B

A,B

 

B

C

 

 

+

C

 

F

 

 

F

S

 

A,F

+

Примерами цепочек, распознаваемых автоматом в примере 12.1, могут служить слова ab, acb, acc, abab. Вообще, распознаваемая цепочка – это любой путь (точнее, слово из его меток), который начинается в стартовой вершине S и заканчивается в одной из заключительных вершин – B или F. Поэтому очевидно, что, например, цепочки bb, aa, abac этим автоматом не распознаются.

Допуская небольшую вольность, будем далее в графах, изображающих автоматы, допускать дуги, не имеющие никаких меток:

Если автомат находится в состоянии A, то он может по такой дуге перейти в состояние B, не изменяя положения каретки. Он имеет право сделать такой переход даже находясь на пустой клетке ленты. Во всем остальном работа автомата остается прежней.

С точки зрения формального определения 12.1 функцию переходов

:Q T P(Q)

надо определять как функцию

:Q T1 P(Q)

где T1 получается из T добавлением специального символа ‘1’, обозначающего пустое место. При задании такого автомата таблицей надо добавить еще один столбец с меткой ‘1’ – допустим, на предпоследнее место, после всех терминалов - , а в клетках этого столбца и в строках с меткой A перечислять состояния, в которые из A идут дуги без меток. Мы не будем вникать в детали, т.к. использование таких переходов все равно не увеличивает выразительных возможностей автоматов – распознаваемые языки будут теми же самыми. В этом можно убедиться из доказательства следующей теоремы.

Теорема 12.1. Язык тогда и только тогда является автоматным, когда он регулярен.

Доказательство. По любой регулярной грамматике G построим некий автомат A = A (G). Множество терминалов T у A и у G общее. Со-

стояния автомата - это нетерминалы G, но к ним добавим еще одно состояние E, которое сделаем заключительным. Состояние S становится, естественно, стартовым состоянием автомата.

Для всякого правила грамматики A a из состояния A проводим ребро в состояние E и помечаем его символом a.

Для всякого правила грамматики A aB из состояния A проводим ребро в состояние B и помечаем его символом a.

Для каждого –правила A из G состояние A делаем заключительным.

Докажем, что L(G) = L(A). Рассмотрим какое-нибудь терминальное слово . Для примера предположим, что

= abc

Пусть L(G). Вывод этой цепочки можно представить в виде

S aA abB abc

или в виде

 

 

 

 

 

S aA

abB abcC

abc

 

 

 

В первом случае грамматика содержит продукции S

aA, A

bB, B

c.

Во втором случае она содержит продукции S

aA, A

bB, B

cC, C

.

Стало быть, либо автомат содержит переходы

 

 

 

 

,

,

 

.

 

 

либо он содержит переходы

 

 

 

 

 

,

,

 

.

 

 

Теперь очевидно, что построенный автомат воспринимает цепочку abc. То, что показано на примере этой цепочки обобщается, понятно, на любой случай выводимости в G любого непустого слова. Если же L(G), то среди правил G есть S , и, значит, состояние S автомата является заключительным, что говорит о том, что A воспринимает пустую цепочку.

Таким образом L(A).

Пусть, наоборот,

L(A). Тогда имеется последовательность конфи-

гураций автомата:

 

 

 

 

< S, abc>

< A, bc>

< B, c > < C, >

для некоторых состояний автомата A,B,C, причем C является заключи-

тельным состоянием, т.е.

C=E или грамматика имеет правило С . При

С=E автомат содержит переходы:

 

 

 

 

,

,

.

Эти переходы могут быть в A только из-за существования в G продукций

 

S

aA, A bB, B

c.

А из этих правил получаем вывод слова abc

в G. Во втором случае, когда

грамматика имеет правило С , состояние С будет заключительным. Переходы автомата в этом случае будут иметь вид

,

,

.

Теперь в грамматике в наличии правила

 

 

S aA, A bB, B

cC, С .

 

Из них опять выводится abc. Следовательно, L(A) = L(G).

Теперь определим обратную конструкцию, которая по автомату A =<Q,T, ,S,F> определяет некую грамматику G = G(A). Нетерминалами грамматики являются состояния автомата. Начальным нетерминалом грамматики является начальное состояние автомата. Терминалы у G и у A

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

Для каждых A

(B,a), где A,B

Q, a T, в грамматику добавляем

правило B aA.

 

 

Для каждых A

(B, 1), где A,B

Q, а 1 обозначает пустой символ

(дуга без метки), в грамматику добавляем цепное правило B A.

Если A – заключительное состояние автомата, в грамматику добав-

ляем –правило A

.

 

Заметим, что в построенной грамматике нет ни одного правила вида A a. Наличие же цепочных правил в силу предложения 11.1 делает данную грамматику эквивалентной регулярной. Опять надо доказать, что L(G) = L(A). Как прежде берем какое-нибудь терминальное слово . Для примера предположим, что

 

 

= abc

Пусть

L(G). Вывод этой цепочки можно представить в виде

 

 

S * aA * abB * abc

или в виде

 

 

 

 

S * aA * abB * abcC * abc

Символ

*

здесь означает возможное применение нескольких цепочных

 

 

правил и заключительное – не цепочное. В первом случае это заключительное правило может быть только правилом вида A a. Но таких в грамматике нет. Значит, возможен только второй случай, в котором в G должно быть множество продукций вида

S A1, A1

A2 ,…, An-1

An , An

aA,

A B1, B1

B2 ,…, Bm-1

Bm , Bm

bB,

B C1,C1

C2 ,…, Ck-1

Ck , Ck

cC,

C D1, D1

D2 ,…, Dt-1

Dt , Dt

 

Значит, автомат должен иметь соответствующие дуги, которые складываются в путь:

Видим, что автомат воспринимает цепочку abc.

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

В любом случае

L(A).

 

 

 

Пусть, обратно, = abc

L(A). Тогда имеется последовательность

конфигураций автомата:

 

 

 

 

< S, abc>

* < A,bc> * < B,c> * < C, >

для некоторых состояний автомата A,B,C. Здесь знак

*

означает после-

 

 

 

 

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

S A1, …, An aA, … , Bm bB, … , Ck cC, …, Dt

с помощью которых легко выводится слово abc. Следовательно L(G) =

L(A).

Теорема доказана.

Замечание 12.1. Доказательство теоремы содержит алгоритмы переделки регулярной грамматики в конечный автомат, а конечного автомата –

врегулярную грамматику. Это имеет практические применения, например

впрограммировании, когда для реализации сложных алгоритмов приходится использовать грамматики.

Замечание 12.2. В первой части доказательства по произвольной регулярной грамматике строится автомат, в котором нет дуг без меток. Сле-

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

Замечание 12.3. Во второй половине доказательства по произвольному автомату, в котором, возможно, есть переходы без меток, строится грамматика, эквивалентная регулярной, но без правил вида A a. В этой грамматике могут быть цепочные правила, но процедура избавления от них даст регулярную грамматику, в которой опять же не будет правил вида

A a. Следовательно, любая регулярная грамматика эквивалентна регулярной грамматике, в которой нет правил вида A a.

Замечание 12.4. Если имеется автомат с дугами без меток, то, согласно замечанию 12.2 он эквивалентен обычному автомату. Как конкретно можно избавиться от переходов, не помеченных никакими терминалами? Доказательство теоремы показывает, что эти переходы – это, фактически, цепочные правила в соответствующей грамматике. Поэтому и дейст-

вовать надо так, как избавляются от цепочных правил в грамматиках. Рассмотрим

Пример 12.2. Дан автомат:

Нетрудно видеть, что этот автомат распознает множество всех слов видов anb, cmb, anbcmb (n=0,1,2,…; m=0,1,2,…). Строим эквивалентный автомат, в котором все переходы имеют метки. Как и при избавлении от це-

почных правил:

 

 

 

по дугам S

B, B

bС строим S

bС;

по дугам S

B, B

cB строим S

cB;

по дугам A

B, B

bС строим A

bС,

по дугам A

B, B

cB строим A

cB.

После этого дуги без меток S B и A

B надо убрать. Получится автомат:

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

 

a

b

1

fin

S

A

C

B

 

A

B

 

 

 

B

 

C

C

 

C

 

 

D

 

D

 

S

 

+

Имея здесь, к примеру, переход без метки C D, мы по переходам D bS и тому факту, что D - заключительное, добавляем переход C bS и делаем C заключительным состоянием:

 

a

b

1

fin

S

A

C

B

 

A

B

 

 

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]