Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка 15.02.docx
Скачиваний:
2
Добавлен:
07.05.2019
Размер:
240.61 Кб
Скачать

Конечный автомат

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

Детерминированный конечный автомат

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

Моделирование ДКА

Вход: Входная строка х, завершаемая символом конца файла eof, ДКА D со стартовым состоянием s0 и множеством заключительных состояний F.

Выход: «Да», если D допускает x, и «нет» в противном случае.

Пример 4. Моделирование ДКА.

bool DFA() // Deterministic Finale Automate

{

s = s0;

с = getnextchar();

while (c != eof)

{

// Переход ДКА, находящегося в состоянии s, // в новое состояние по получению

// входного символа c.

s = move(s, c);

c = getnextchar();

}

return (s F) ;

}

-НКА

A=<Q,,,q0, F>

  • Q – множество состояний

  •  – множество входных символов (алфавит)

  • q0 – начальное состояние (один из элементов Q)

  • F, подмножество Q, - множество допускающих состояний

  • , функция переходов (q| qQ, {})

Моделирование -НКА

Вход: Входная строка х, завершаемая символом конца файла eof,  -НКА N со стартовым состоянием s0 и множеством заключительных состояний F.

Выход: «Да», если N допускает x, и «нет» в противном случае.

Пример 5. Моделирование -НКА.

bool NFA() // Nondeterministic Final Automate

{

S = EClosure(s0);

c = getnextchar();

while (c != eof)

{

S = EClosure(move(S, c));

c = getnextchar();

}

return (SF != 0);

}

Построение дка из -нка

Вход: НКА N.

Выход: ДКА D, допускающий тот же язык

Метод: Строим таблицу переходов Dtran для D. Каждое состояние ДКА является множеством состояний НКА, Dtran строится так, чтобы D «параллельно» моделировал все возможные перемещения N по входной строке.

Таблица 4. Операции, которые используют для отслеживания множеств состояний НКА.

Операция

Описание

e-замыкание(s)

Множество состояний НКА, достижимых из состояния s только по -переходам.

(-closure(s))

e-замыкание(Т)

Множество состояний НКА, достижимых из s | sТ только по -переходам.

(-closure(Т))

move(T, a)

Множество состояний НКА, в которые имеется переход из s | sТ по входному символу a

Где s – состояние НКА; T – множество состояний НКА (T = {s}); Ds = EClosure({s0});

Пример 6. Построение ДКА из -НКА (пример 1).

while (Ds имеет непомеченное состояние T)

{

пометить T;

foreach(входной a)

{

U = Eclosure(move(T,a));

if (U Ds) Добавить U в Ds как непомеченное;

Dt[T,a] = U;

}

}

Eclosure(T)

{

// Поместить все состояния из T в стек.

foreach(s in T) stack.push(s);

// Инициализировать результат множеством T

Eclosure = T;

while (not stack.Empty)

{

t = stack.Pop();

foreach (u с дугой от t к u, помеченной )

{

if (uEclosure)

{

EClosure.Add(u);

stack.Push(u);

}

}

}

}

Рисунок 2. -НКА для L(R), R = (a | b)* abb).

Инициализация:

EClosure (s0) = {0,1,2,4,7}

Ds = {A={0,1,2,4,7}}

Dt = {}

Шаг 1:

B = EClosure(move(A, a)) = EClosure({3,8}) = {1,2,3,4,6,7,8}

C = EClosure(move(A,b)) = EClosure({5}) = {1,2,4,5,6,7}

Dt[A,a] = B

Dt[A,b] = C

Ds = {A={0,1,2,4,7}, B={1,2,3,4,6,7,8}, C={1,2,4,5,6,7}}

Шаг 2:

D = {1,2,4,5,6,7,9}

E = {1,2,4,5,6,7,10}

Рисунок 3. -НКА для L(R), R = (a | b)* abb).