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

Автоматы, языки и грамматики

.pdf
Скачиваний:
50
Добавлен:
09.02.2015
Размер:
470.83 Кб
Скачать

 

 

 

 

 

 

b

 

 

 

 

 

 

 

Si

 

 

 

 

 

Sj

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Получаем правила из функции возбуждения.

 

Следовательно, si sj

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Vт = {0,1}

 

 

1

 

 

 

 

 

 

Vn ={I, A, B}

 

 

 

 

 

 

 

 

 

0

0

I

 

A

 

 

 

I

 

 

 

 

R = { I0I;

 

 

I1A;

1

1

A0A;

A

1B;

 

 

 

 

B0B;

 

B1I}

B

 

 

 

0

В результате преобразования видно, что между автоматными грамматиками и автоматами существует взаимно-однозначное соответствие, следовательно, грамматику можно рассматривать как форму представления конечного автомата.

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

Пусть A0 – недетерминированный конечный автомат.

A0 = <P0, S0, s00, φ0, F0>

F0 – множество конечных состояний автомата.

S = {S0, S1, S2}

M(S) = {{S0}, {S1}, {S2}, {S0, S1}, {S0, S2}, {S1, S2}, {S0, S1, S2}} – множество всех подмножеств множества S.

φ: P*SS – детерминированный алфавит.

φ0: P0*S0M(S) - недетерминированный автомат.

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

ТЕОРЕМА: Если L(A0) – язык, который допускается некоторым конечным автоматом A0, то существует детерминированный конечный автомат A, который допускает этот же язык.

Преобразование недетерминированного автомата в детерминированный

Имеется два способа:

1. Общий способ Пример.

 

 

b

 

a

I

 

B

 

 

a

a

 

 

 

 

a

 

b

С

Построение функций возбуждения: φ(I, a) = [I, c]

φ(I, b) = [B] φ(B, a) = [C] φ(B, b) = [0] φ(C, a) = [B] φ(C, b) = [B] φ(IB, a) = [IC] φ(IB, b) = [B] φ(IC, a) = [IBC] φ(IC, b) = [B] φ(BC, a) = [BC] φ(BC, b) = [B]

φ(IBC, a) = [IBC] φ(IBC, b) = [B]

b

I a

b

b

IC

a

a

IBC

a

P = {a, b}

S = {I, B, C}

M(S)={[I], [B], [C], [IB], [IC], [BC], [IBC], 0}

 

b

 

B

a

0

 

a

b

C

b

b

IB

BC

a

Вершины IB и BC являются недостижимыми => исключаем их из рассмотрения. Вершина 0 – тупиковое состояние => его также исключаем из рассмотрения. Получаем детерминированный автомат:

 

b

a

 

 

b

I

B

C

a

b

a

IC

a

IBC

a

Это общий способ построения автомата, так как мы рассматривали все подмножества S. Но при большом S число этих подмножеств велико.

2. Сокращенный способ.

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

a)Строится заготовка таблицы переходов детерминированного конечного автомата.

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

c)Если полученное подмножество состояний или состояния отсутствуют в левой части таблицы переходов, то они заносятся туда и осуществляется переход к пункту b.

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

 

Пример.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pi / Si

a

b

a

 

I

 

 

 

 

 

 

 

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

IC

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IC

IBС

B

 

 

 

 

 

a

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

 

 

 

B

C

---

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IBC

IBС

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a

 

 

 

 

 

 

 

 

 

b

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

B

B

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

С

b

a

 

I

B

a, b

С

 

a

b

b

 

 

 

 

 

С

a

IСB

Преобразование некоторых типов грамматики к автоматному ввиду

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

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

Пусть задан язык:

L = {x1 x2 x3…xn}, где xi € Vt* - цепочки языка.

xi = a1a2a3…am – последовательность символов, где ai € Vt

Тогда для порождения конкретной цепочки xi введем следующие нетерминальные

символы A1, A2,…, Am-1, тогда запишем: Xi a1A1

A1a2A2

Am-2am-1Am-1 Am-1am

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

Рассмотрим приведение контекстно-свободные грамматики к автоматному виду.

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

Правила вида:

A xB – правосторонняя грамматика, где A, B VN – нетерминальные символы. A Bx – левосторонняя грамматика.

A x – заключительное правило.

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

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

Пусть задана правосторонняя грамматика:

G: <Vt, Vn, I, R>

R: A xB , где x € Vt*

Предположим, что xi = a1a2…am введем нетерминальные символы A1A2…Am-1 и добавим правила:

A a1A1 A1a2A2

Am-1 am-1Am-1

Am-1 amB, либо Am-1 am

Цепочка правил, заканчивающаяся Am-1 amB заменит одно правило A xB. Цепочка правил, заканчивающаяся Am-1 am заменит правило A x

Применяя данную процедуру для каждого правила праволинейной грамматики, получим автоматную грамматику.

Утверждение. Если контекстно-свободная грамматика содержит правила вида AB, где A, B VN, то ее можно привести к автоматному виду.

Такая грамматика может быть преобразована в контекстно-свободную грамматику, не содержащую таких правил.

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

Пусть есть правила вида: R = {…AB…BCx}

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

Пусть есть цепочка:

ώ=>ξ1 A ξ2, тогда данная цепочка преобразуется в конечную следующим образом:

ξ1 A ξ2 => ξ1 B ξ2=> ξ1 Cx ξ2

Что равносильно A => Cx.

Пусть есть правила вида:

R = {A1A2…AnZ}

То если есть цепочка вида:

ώ=>ξ1 A ξ2, тогда данная цепочка преобразуется в конечную следующим образом:

ξ1 A1 ξ2 =>…=> ξ1 An ξ2=> ξ1 Z ξ2

Или проще: A1 => Z

Алгоритм получения правил, не содержащих правил вывода нетерминальных символов.

Пусть существует грамматика с множеством правил, которые можно разбить на подмножества, например:

1) Грамматика имеет набор правил R. Разобьем его на R1 и R2. Причем:

в R1 будут входить только правила типа A B , где A,B € Vn

в R2 будут входить только правила автоматной грамматики A xB , A x

2) Для каждого правила из множества R1, содержащего символ Ai в левой части, построим множество правил S(Ai) следующим образом,

Если из Ai выводится символ An (Ai => An),

а из An=>ηB , то в S(Ai) включаем правило вида Ai ηB.

3) Проделывая эту процедуру для каждого символа Ai, получаем множество правил:

R = Ui=1k S(Ai) v Ri где k – число нетерминальных символов, находящихся слева в правилах набора R подмножества.

Построение грамматики будет автоматной и эквивалентно исходной.

Пример.

G:

R = {IaM, MA, AaA, AB, BbB, Bb}

Vt = {a , b}

Vn = {I , M , A , B}

R1 = {M A , A B}

R2 = {I aM , A aA, B bB , B b} S(M) = {MaA , M bB , M b}

S(A) = {A bB , A b}

R = {M aA , M bB , M b , A bB , A b , I aM , A aA , B bB , B b}

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

Контекстно-свободная грамматика не может быть преобразована в автоматную, если:

1)Содержит одновременно левосторонние и правлосторонние правила.

2)Содержит правила с самовосстановлением (A φAψ , φ,ψ € V* - любые символы, причем не пустые).

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

Построение распознавателей и преобразователей

Распознаватель – это автомат, у которого нет выходного. Он определяет, является ли заданная цепочка допустимой для автомата.

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

Синтаксический преобразователь позволяет решать задачу синтаксического анализа, так как его выходная последовательность (цепочка), есть синтаксический разбор заданной входной цепочки.

Построение распознавателей

Пример.

Построить распознаватель из множества слов двоичного алфавита длиной в три буквы, слова с двумя единицами, т.е. цепочек из «0» и «1» длиной три.

Vt = {0, 1}

L = {011, 101, 110}

Vn = {I, A, B, C, D, Z, E}

I 0A 1C 1Z

I 1B 0D 1Z

I 1B 1E 0Z

 

 

 

 

1

0

A

 

 

C

 

 

 

 

I

 

 

 

1

 

 

 

1

 

0

 

D

 

 

 

1

B

 

 

Z

 

 

 

 

 

1

 

0

 

 

 

 

E

R = {I0A, I1B , A1C , B0D , B1E , C1Z , D1Z , E0Z , ZE}

Пример.

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

Введем два конечных состояния Z1 для допустимых слов и Z2 для недопустимых слов.

I 0 A 1 C 1 Z1

I 1 B 0 D 1 Z1

I 0 A 0 F 0 Z2

I 0 A 0 F 1 Z2

I 0 A 1 C 0 Z2

I 1 B 0 D 0 Z2

I 1 B 1 E 0 Z1

I 1 B 1 E 1 Z2 P = {0, 1}

Vn = {I, A, C, Z1, Z2, B, D, E, F } = S

Где E – пустой символ.

 

 

С

 

1

 

1

 

 

0

A

 

 

0

 

 

 

 

 

 

Z1

 

0

 

 

 

 

 

 

 

 

F

0,1

 

 

 

 

1

 

 

 

 

I

 

 

 

 

 

0

D

 

 

1

 

 

 

0

 

B

 

 

Z2

 

 

 

0

 

1

1

E

 

Алгоритм построения преобразователя.

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

Пусть задана автоматная грамматика: Задана цепочка G = <VT, VN, I, R>

T = {P, S, s0, W, φ, ψ}

P , S , W – алфавит входных состояний и выходов. s0 – начальное состояние.

φ , ψ – функции переходов и выходов.

P = WT / e S = VN

s0 = I

φ , ψ R

Для построения преобразователя необходимо:

1)По заданной грамматике cтроится распознаватель.

2)В качестве выходного алфавита использовать номера правил грамматики.

3)Строится множество функций выходов преобразователя. Для каждого правила с номером m вида A mbC, где A, C € VN и b € VT построить фрагмент:

 

b/m

A

C

Пример.

G:

VT = {a, b, c} VN = {I, A, B} I

R = {I aA, A aA, A bB, B bB, Bc, (BcZ, Z E)}

a / 1

b / 3

 

a / 5

I

A

B

Z

a / 2

b / 4

Построим распознаватель.

W = {1, 2, 3, 4, 5} – выходной алфавит.

Если подать на вход aabbbc, то получим синтаксический разбор [1 , 2 , 3 , 4 , 4, 5].