Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_tyap (1).doc
Скачиваний:
23
Добавлен:
17.04.2019
Размер:
1.05 Mб
Скачать

12. Алгоритм построения детерминированного конечного автомата по недетерминированному конечному автомату

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

Алгоритм 1. Построение детерминированного конечного автомата по недетерминированному.

Вход. НКА M = (A, , , S, F).

Выход. ДКА M' = (A’, , ’, S’, F’), такой что L(M) = L(M').

Метод. Каждое состояние результирующего ДКА - это некоторое множество состояний исходного НКА.

В алгоритме будут использоваться следующие функции:

e-closure(R) (R  A) - множество состояний НКА, достижимых из состояний, входящих в R, посредством только переходов по e, т.е. множество

move(R, a) (R  A) - множество состояний НКА, в которые есть переход на входе a для состояний из R, т.е. множество

Вначале A' и ' пусты. Выполнить шаги 1-4:

- Определить S' = e-closure({S}).

- Добавить S' в A' как непомеченное состояние.

- Выполнить следующую процедуру:

while (в A' есть непомеченное состояние R){

пометить R;

for (каждого входного символа a T){

S = e-closure(move(R, a));

if (N ){

if (N A')

добавить N в A' как непомеченное состояние;

определить '(R, a) = N;

}

}

}

- Определить F' = {N|N A', N F }.

Пример. Результат применения алгоритма 1 приведен на рис.

 

Рис.

13. Нормальная форма Грейбах. Алгоритм преобразования произвольной контекстно-свободной грамматики к грамматике в нормальной форме Грейбах.

Нетерминал А КС-грамматики G = (N, , Р, S) называется рекурсивным, если A+A для некоторых  и . Если  = е, то А называется леворекурсивным. Аналогично, если  = е, то А называется право рекурсивным. Грамматика, имеющая хотя бы один леворекурсивный нетерминал, называется леворекурсивной. Аналогично определяется праворекурсивная грамматика. Грамматика, в которой все нетерминалы, кроме, быть может, начального символа, рекурсивные, называется рекурсивной.

Лемма. Пусть G = (N, , Р, S) — КС-грамматика, в которой

A = A1| A2|…| Am| 1 | 2 |…|n

- все А-правила из Р и ни одна из цепочек I - не начинается с А. Пусть

G' = (N  {A'}, , P',S)

где А' — новый нетерминал, а Р' получается из Р заменой А-правил правилами

A 1 | 2 |…|n| 1 A’ | 2 A’|…|nA

A’ 1 | 2 |…| m| 1 A’ | 2 A’|…| mA

Тогда L(G')=L(G).

Доказательство. Цепочки, которые можно получить в грамматике G из нетерминала А применением A-правил лишь к самому левому нетерминалу, образуют регулярное множество (1 + 2 +…+n)( 1 + 2 +…+ m)*. Это в точности те цепочки, которые можно получить в G' из А с помощью правых выводов, применив один раз A-правило и несколько раз A'-правила. (В результате весь вывод уже не будет левым.) Все шаги вывода в G, на которых не используются A-правила, можно непосредственно сделать в G', так как не A-правила в G и G' одни и те же. Отсюда можно заключить, что L{G')  L{G).

Обратное включение доказывается по существу так же. В G' берется правый вывод и рассматриваются последовательности шагов, состоящие из одного применения A-правила и нескольких применений A'-правил. Таким образом, L (G) = L{G').

На рис. показано, как действует преобразование, описанное в лемме, на деревья выводов.

A A

/ \ / \

A αi1 β A’

/ \ / \

A αi2 αik A’

/ \ / \

. αik-1 A’

. / \

A .

/ \ A’

A αik / \

/ αi2 A’

Β \

αi1

Рис. Части деревьев: а —часть Дерева в G; б —соответствующая часть в G'.

Пример Пусть G0 —наша обычная грамматика с правилами

EE+TT

TT*FF

F(E)a

Если применить к ней конструкцию леммы, то получится эквивалентная ей грамматика G’ с правилами

ETTE’

E’+T+TE’

TFFT

T’*F*FT’

F(E)a

КС-грамматика G = (N, , Р, S) называется грамматикой в нормальной форме Грейбах, если в ней нет е-правил и каждое правило из Р, отличное от Sе, имеет вид Аа, где a и N*.

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

Лемма. Пусть G = (N, , Р, S) – не леворекурсивная грамматика. Существует такой линейный порядок < на N, что если АВ принадлежит Р, то А< В.

Доказательство. Пусть R — такое отношение на N, что ARB тогда и только тогда, когда A+ В для некоторого . Так как грамматика G не леворекурсивна, то R — частичный порядок (транзитивность легко доказывается). Отношение R можно расширить до линейного порядка <, обладающего нужным свойством.

Алгоритм преобразования произвольной контекстно-свободной грамматики к грамматике в нормальной форме Грейбах

Вход. Не леворекурсивная приведенная КС-грамматика G = (N, , P,S).

Выход. Эквивалентная грамматика G' в нормальной форме Грейбах.

Метод.

(1) Построить с помощью леммы такой линейный порядок < на N, что каждое A-правило начинается либо с терминала, либо с такого нетерминала В, что А < В. Упорядочить N={A1, ..., Аn} так, что А1 < А2 <... <Аn.

(2) Положить i = n - 1.

(3) Если i=0, перейти к шагу (5). В противном случае заменить каждое правило вида AiAj, где j > i, правилами Ai 1…m, где Аj1…m — все Aj-правила.

(4) Положить i = i – 1 и вернуться к шагу (3).

(5) Сейчас правая часть каждого правила (кроме, возможно, Se) начинается терминалом. В каждом правиле А аХ1...Xk заменить Хj   новым нетерминалом .

(6) Для новых нетерминалов , введенных на шаге (5), добавить правила Xj.

Пример. Рассмотрим грамматику G с правилами

ETTE’

E’+T+TE’

TFFT

T’*F*FT’

F(E)a

Упорядочим нетерминалы следующим образом: Е' <Е <Т' < T<F.

Правая часть каждого F-правила начинается терминалом, как и должно быть, так как F— наибольший нетерминал в этом упорядочении. Предшествующий ему нетерминал Т имеет правила Т F  FT', так что, заменив в них F, получаем Т(Е)а (Е)Т'аТ'. Переходя к Т', обнаруживаем, что здесь ничего менять не надо. Затем заменяем E-правила правилами

Е(Е) а (Е) T’ | аТ’  (Е) Е'  аЕ’  (Е) Т’Е'  аT’Е'

В E'-правилах ничего менять не надо.

На шагах (5) и (6) появляются новый нетерминал )' и правило )'  ), поэтому все вхождения ) в предыдущих правилах надо заменить на )'. Таким образом, в результате получится грамматика в нормальной форме Грейбах с правилами

Е(Е)’ а (Е)’ T’ | аТ’  (Е)’ Е'  аЕ’  (Е)’ Т’Е'  аT’Е'

Е’ + T | + ТЕ'

T(Е)’ а (Е)’ T’ | аТ’

T’*F F T’

F(Е)’ а

)’)

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

Второй метод построения грамматики, в которой каждое правило имеет вид Аа. Здесь грамматика переписывается только один раз. Пусть G = (N, , Р, 5) —КС-грамматика, в которой нет е-правил (даже вида Sе) и цепных правил.

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

AAaBBBb

BaABAaBdc

можно представить в виде системы уравнений

A=AaB+BB+b

B=aA+Baa+Bd+c

где А и В — неизвестные, представляющие множества.

Алгоритм преобразования к нормальной форме Грейбах

Вход. Приведенная грамматика G = (N, , Р, S) без правил вида Sе.

Выход. Эквивалентная грамматика G' = (N', , Р' S) в нормальной форме Грейбах.

Метод.

(1) По грамматике G построить систему определяющих уравнений A=AR+B в алфавитах N и .

(2) Пусть Q — матрица порядка n, состоящая из новых символов, и #N = n. Построить новую систему определяющих уравнений A = BQ+В, Q=RQ + R и соответствующую грамматику G1. Так как в векторе В каждая компонента, отличная от , начинается терминалом, а такие компоненты должны быть в силу приведенности грамматики G, то для AN все A-правила грамматики G1 будут начинаться терминалами.

(3) Так как G — приведенная грамматика, то е не является элементом матрицы R. Поэтому для каждого элемента q матрицы Q все соответствующие q-правила грамматики G1 начинаются символами из N. В тех правых частях этих правил, которые начинаются нетерминалом, заменить этот нетерминал А правыми частями всех A-правил. В результате получится грамматика, у которой правые части всех правил начинаются терминалом.

(4) Если в правой части некоторого правила терминал а встречается не на первом месте, заменить его новым нетерминалом а' и добавить правило а'а. Результирующую грамматику обозначить через G'.

Пример Рассмотрим грамматику, соответствующую системе определяющих уравнений:

AAaBBBb

BaABAaBdc

Перепишем систему, согласно шагу (2) алгоритма, в виде

(1)

Затем добавим систему

(2)

Системам и соответствует грамматика

AbWaAYcYb

BbXaAZcZaAc

WaBWaB

XaBX

YBWAaYdYB

ZBXAaZdZAad

Заметим, что X — бесполезный символ. На шаге (3) в правилах YBWAaYB и ZBXAaZdZAa нетерминалы А и В заменяются соответствующими правыми частями правил. Так как это преобразование и преобразование на шаге (4) уже знакомы.

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