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

XVYggbpFw2

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

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

элементных классов:

 

 

a

b

c

fin

0

1

2

3

 

 

 

 

 

 

1

S

G

Err

Err

 

1

1

1

1

2

G

Err

H

I

+

2

6

6

2

3

H

Err

C

J

 

1

3

3

3

4

I

K

H

J

+

2

7

7

7

5

C

Err

L

F

 

1

4

4

4

6

J

K

Err

J

+

2

7

9

9

7

K

G

H

Err

+

2

8

8

8

8

L

K

H

M

+

2

7

7

11

9

F

K

Err

M

+

2

7

9

12

10

M

G

Err

M

+

2

7

10

10

 

Err

Err

Err

Err

 

1

5

5

5

Но на этом примере можно посмотреть, как именно можно считать каждое отношение n+1 через предыдущее n. Например, 1. В таблице

состояния из класса 1 изображены красным цветом. Цвет тем самым показывает, в каком 0-классе лежит элемент. При вычислении отношения 1

нас, в частности, интересует, каким образом разделится 0-класс 2. Это зависит от того, в какие 0-классы попадают образы его элементов

G,I,J,K,L,F,M под действием терминальных отображений a,b,c. Проще – от цвета этих образов:

G

кр

кр

чрн

I

чрн

кр

чрн

J

чрн

кр

чрн

K

чрн

кр

кр

L

чрн

кр

чрн

F

чрн

кр

чрн

M

чрн

кр

чрн

В строках этой таблицы присутствуют три различных “спектра”:

(кр, кр, чрн) – у G, (чрн, кр, чрн) – у I,J,L,F,M и (чрн, кр, кр) – у K. Это и дает три 1-класса с номерами 6,7,8, на которые разбивается 0-класс 2.

Аналогично вычисляются и n+1-классы по n-классам. Но при этом каждому n-классу надо придумать свой цвет. Раскрашивать их, конечно, необязательно. Можно обойтись и номерами.

Например, при вычислении отношения

2

рассматриваем класс 7 от-

 

 

ношения 1. Пять его элементов имеют “спектры”:

I – 8,3,7

 

 

J – 8,5,7

 

 

L – 8,3,7

 

 

F – 8,5,7

 

 

M –6,5,7

 

 

Здесь числа I – 8,3,7, к примеру, - это номера

1-классов, в которых лежат

Ia, Ib, Ic, т.е. K, H, J. Теперь видим, что данные пять элементов разбиваются на три 1-класса {I,L}, {J,F}, {M}, что и отражено в таблице.

Замечание 14.1. Минимальный автомат, построенный в примере 14.2, имеет непродуктивное состояние Err. Если его убрать, мы получим исходный автомат на рис. 13.2. Это говорит о том, что автомат на рис. 13.2 оптимальный. А всю проделанную процедуру можно понимать как про-

верку оптимальности.

Пример 14.3. Решим задачу построения минимального детерминированного автомата, который распознает заранее заданный язык. В качестве такого языка L возьмем множество всех слов от букв a,b,c, в каждом из которых есть хотя бы одно из подслов aba или abba. Надо найти наилучший автомат, распознающий такие слова.

Начнем с построения произвольного автомата для L. Эта задача не представляется слишком сложной. Логика здесь такова. От стартового состояния прокладываем два пути. Один для слов, содержащих aba. Другой – для слов с abba. Оба пути должны вести к заключительным состояниям. На обоих путях до прохождения aba или abba и после их прохождения должна быть возможность включить в маршрут любые последовательности из букв a,b,c.

После некоторого размышления автомат принимает вид (возможны, конечно, и другие варианты):

Для дальнейших вычислений этот автомат надо записать в виде таб-

лицы:

 

a

b

c

 

S

S,A,D

S

S

 

A

 

B

 

 

B

C

 

 

 

C

C

C

C

+

D

 

E

 

 

E

 

F

 

 

F

G

 

 

 

G

G

G

G

+

Процедура из п. 13 вычисления детерминированного автомата даст таблицу:

 

a

b

c

 

Fin

S

H

S

S

S

 

H

H

I

S

A,D,S

 

I

J

K

S

B,E,S

 

J

J

L

M

A,C,D,S

+

K

N

S

S

F,S

 

L

J

O

M

B,C,E,S

+

M

J

M

M

C,S

+

N

N

P

Q

A,D,G,S

+

O

R

M

M

C,F,S

+

P

R

T

Q

B,E,G,S

+

Q

N

Q

Q

G,S

+

R

R

U

V

A,C,D,G,S

+

T

N

Q

Q

F,G,S

+

U

R

W

V

B,C,E,G,S

+

V

R

V

V

C,G,S

+

W

R

V

V

C,F,G,S

+

Процесс вычисления минимального автомата оказывается несложным и дан в таблице:

 

a

b

c

0

Спк0

1

Спк1

2

Спк2

3

S

H

S

S

1

111

1

111

1

 

1

H

H

I

S

1

111

1

131

4

 

4

I

J

K

S

1

211

3

231

5

 

5

J

J

L

M

2

222

2

222

2

222

2

K

N

S

S

1

211

3

211

6

 

6

L

J

O

M

2

222

2

222

2

222

2

M

J

M

M

2

222

2

222

2

222

2

N

N

P

Q

2

222

2

222

2

222

2

O

R

M

M

2

222

2

222

2

222

2

P

R

T

Q

2

222

2

222

2

222

2

Q

N

Q

Q

2

222

2

222

2

222

2

R

R

U

V

2

222

2

222

2

222

2

T

N

Q

Q

2

222

2

222

2

222

2

U

R

W

V

2

222

2

222

2

222

2

V

R

V

V

2

222

2

222

2

222

2

W

R

V

V

2

222

2

222

2

222

2

В столбцах Спк0, Спк1, Спк2, стоят спектры состояний в отношениях 0, 1, 2. Например, 131 в строке для H и столбце Спк1 говорит, что Ha,

Hb, Hc лежат в классах 1,3,1 по отношению

1. По столбцам спектров оп-

ределяются классы следующего отношения.

Видим, что 1, 2 совпали.

Значит они есть окончательное . При нем состояния J, L,M,…,W сжимаются в одну точку (допустим, J). Соответственно получаем минимальный детерминированный автомат из 5 состояний, изображенный на схеме:

Упражнения

14.1.Для автоматов упражнения 13.1 построить им эквивалентные детерминированные и минимальные.

14.2.Проверить, является ли данный автомат минимальным и, если нет, построить ему эквивалентный минимальный.

a)

b)

15.РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ

Вэтом параграфе приводится еще один способ определения регулярных или, то же самое, (как мы видели в предыдущем параграфе) автоматных языков.

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

К исходным языкам относятся:

1) a для любого терминала a T. Это язык из одного единственного слова a.

2)1 обозначает язык, состоящий из единственного пустого слова.

3)0 обозначает язык, не содержащий ни одного слова.

Из исходных языков строятся новые по следующим правилам:

1) Для языка L выражение L* обозначает множество всех цепочек

вида

 

 

 

 

 

1 2 ... n

для

1,

2 , ... ,

n

L. В L* входит и пустая цепочка . По определению

считаем, что

 

 

 

 

 

 

 

 

 

0*=1,

 

 

 

 

 

1*=1.

 

2) Для языков L1 , L2

выражение L1L2 обозначает множество всех

цепочек вида

 

 

 

 

 

 

 

 

 

1

2

для

1

L1 , 2

 

L2.

 

 

 

3) Для языков L1 , L2

выражение L1 + L2 (или L1 | L2) обозначает

объединение множеств L1 , L2.

 

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

-операция * (итерация, звездочка Клини);

-операция 2) (умножение или конкатенация);

- операция + (объединение).

Более формально понятие регулярного выражения определяется так.

Определение 15.1. Пусть T = {a1,…, an} - множество терминалов. Регулярное выражение над T – это слово языка, который в алфавите

T { 0, 1, (, ), *, +}

определяется КС-грамматикой с правилами:

S B | B+S

B A | AB

A 0 | 1 | a1 || an | A*| (S)

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

a) символы 0, 1 и все терминалы - регулярные выражения;

b) если r – регулярное выражение, то (r) - регулярное выражение; c) если r – регулярное выражение, то r* - регулярное выражение;

d) если r и q – регулярные выражения, то rq , r + q - регулярные выражения.

Многие авторы так и поступают. Но, не смотря на формальную правильность такого определения, его нельзя считать удовлетворительным. Причина в том, что пользуясь им нельзя (или очень неудобно) что-то доказать для регулярных выражений с использованием индукции по их построению. Например, пусть q =a+b и r =c+d. Это – регулярные выражения. Их произведение по п. d) – тоже. Но естественное ожидание того, что это

произведение qr определяет множество произведений xy, где x

q, y r ,

т.е. с тем, что qr = (a+b) (c+d), не согласуется с формальным: qr =

a+bc+d.

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

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

суммой чего-либо не является, а есть произведение неких частей – назовем их атомами (смысл нетерминала A); каждый атом – это 0, 1 или терминал, либо получается из атома итерацией, либо - заключением любого регулярного выражения в скобки.

Это определение не так понятно, как набор пунктов a) – d), но посвоему прелестно. Во-первых, оно абсолютно строгое. Во-вторых, его грамматика является однозначной и согласованной с приоритетом операций. Для примера, приведем деревья разбора цепочек (a+b) (c+d) и a+bc+d:

и

Понятно, что любое регулярное выражение определяет некоторое множество цепочек алфавита T. Это язык, определяемый (задаваемый) ре-

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

a)p+q = q+p

b)p+(q+r) = (p+q)+r

c)p(qr) = (pq)r

d)r 0 = 0 r = 0

e)r 1 = 1 r = r

f)r(p + q) = rp + rq, (p + q) r = pr + qr

g)r** = r*

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

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

Для множества терминалов T = {a1, a2,…, an} множество T, понимаемое как множество слов длины 1, определяется регулярным выражением a1|a2|…|an. Поэтому естественно это выражение тоже обозначать буквой T. Тогда T* будет обозначать множество всех терминальных цепочек.

TT* будет множеством непустых цепочек. Его принято обозначать как T+

.

Очень часто вместо символа + в регулярных выражениях используют знак | . Это даже более естественно, т.к. в грамматиках знак | означает союз “или”. И именно такой смысл ему лучше всего придавать при чтении регулярных выражений.

Примеры регулярных выражений.

Пусть T = {a,b,c}. Тогда

1) a*b*c* есть множество всех слов вида ambnck, где m,n,k 1.

2)a*b*c*aba a*b*c* есть множество цепочек, содержащих aba в качестве подслова.

3)a*b*c*aba a*b*c* + a*b*c*aba a*b*c* есть множество цепочек,

содержащих в качестве подслова хотя бы одно из слов aba или abba.

4)(ab)* (ba)* (aa)* (bb)* = (ab | ba | aa | bb)* есть множество всех слов четной длины из букв a, b.

5)((b|c)*a(b|c)*a)*(b|c)* - множество всех слов с четным числом букв a.

Теорема 15.1.(С.Клини) Язык является регулярным тогда и только тогда, когда он определяется регулярным выражением.

Доказательство. Сначала докажем, что любое регулярное выражение определяет автоматный язык. Это довольно простая часть доказательства. Действовать надо индукцией по определению регулярных выражений. Сначала, в соответствии пп а) определения 15.1 надо построить автоматы для каждого терминала и регулярных выражений 0 и 1. Очевидно, эти автоматы есть

- для терминала a;

- для пустого множества 0;

- для

 

1.

 

Теперь допустим, что построены автоматы Aq и Ar для регулярных

выражений q и r. Согласно пп. б) определения 15.1 по этим автоматам надо построить автоматы для регулярных выражений (r) , r* , rq , r + q.

Для (r) - это тот же автомат Ar.

Автомат для r* получается из Ar следующими манипуляциями. От каждого заключительного состояния Ar проводим дугу без метки к стартовому состоянию Ar (если, конечно, такой дуги еще не было). Если стар-

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

Автомат для rq получается из Aq и Ar следующим образом. Счита-

ем, что среди состояний этих автоматов нет общих, для чего предварительно надо сделать необходимые переобозначения. После этого объединяем вместе состояния автоматов и инцидентные им дуги. Затем

1.От каждого заключительного состояния Ar проводим дугу без метки в стартовое состояние автомата Aq.

2.Все заключительные состояния автомата Ar выкидываем из множества заключительных.

3.Стартовым состоянием нового объединенного автомата считаем только стартовое состояние Ar.

Вот схема, иллюстрирующая это построение:

По

и

строится

.

Наконец, столь же просто автомат для r+q получается из Aq и Ar.

Также делаем переобозначения и объединяем автоматы. Но стартовым делаем добавочное состояние, из которого в бывшие стартовые состояния Aq

и Ar проводим дуги без меток. Получим:

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