Конечный автомат. Конечные автоматы Конечный автомат с состояниями s a b

Лекция 5.

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

Дискретно-детерминированные модели (F -схемы)

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

Абстрактно конечный автомат (англ. finite automata) можно представить как математическую схему (F -схему ), характеризующуюся шестью элементами: конечным множеством Х входных сигналов (входным алфавитом); конечным множеством Y выходных сигналов (выходным алфавитом); конечным множеством Z внутренних состояний (внутренним алфавитом или алфавитом состояний); начальным состоянием z 0 , z 0 Î Z ; функцией переходов j(z , x ); функцией выходов y(z , x ). Автомат, задаваемый F -схемой: F = áZ , X , Y , y, j, z 0 ñ, функционирует в дискретном времени, моментами которого являются такты, каждому из которых соответствуют постоянные значения входного и выходного сигналов и внутренние состояния. Обозначим состояние, а также входной и выходной сигналы, соответствующие t -му такту при t = 0, 1, 2, …, через z (t ), x (t ), y (t ). При этом по условию z (0) = z 0 , а z (t Z , x (t X , y (t Y .

Пример. Простейший автомат поведения льва.

Входной алфавит: "антилопа", "охотник".

Внутренние состояния: "сытый", "голодный".

Выходной алфавит: "съесть", "спать", "убежать"

Таблица переходов:

Абстрактный конечный автомат имеет один входной и один выходной каналы. В каждый момент t = 0, 1, 2, … дискретного времени F -автомат находится в определенном состоянии z (t ) из множества Z состояний автомата, причем в начальный момент времени t = 0 он всегда находится в начальном состоянии z (0) = z 0 . В момент t , будучи в состоянии z (t ), автомат способен воспринять на входном канале сигнал x (t X и выдать на выходном канале сигнал y (t ) = y[z (t ), x (t )], переходя в состояние z(t +1) = j[z (t ), x (t )], z (t Z , y (t Y . Абстрактный конечный автомат реализует некоторое отображение множества слов входного алфавита X на множество слов выходного алфавита Y . Другими словами, если на вход конечного автомата, установленного в начальное состояние z 0 , подавать в некоторой последовательности буквы входного алфавита x (0), x (1), x (2), …, т.е. входное слово, то на выходе автомата будут последовательно появляться буквы выходного алфавита y (0), y (1), y (2), …, образуя выходное слово.

Таким образом, работа конечного автомата происходит по следующей схеме: в каждом t -м такте на вход автомата, находящегося в состоянии z (t ), подается некоторый сигнал x (t ), на который он реагирует переходом (t +1)-го такта в новое состояние z (t +1) и выдачей некоторого выходного сигнала. Сказанное выше можно описать следующими уравнениями: для F -автомата первого рода, называемого также автоматом Мили ,

z (t +1) = j[z (t ), x (t )], t = 0, 1, 2, …; (2.15)

y (t ) = y[z (t ), x (t )], t = 0, 1, 2, …; (2.16)

для F -автомата второго рода

z (t +1) = j[z (t ), x (t )], t = 0, 1, 2, …; (2.17)

y (t ) = y[z (t ), x (t – 1)], t = 1, 2, 3,…. (2.18)

Автомат второго рода, для которого

y (t ) = y[z (t )], t = 0, 1, 2, …, (2.19)

т.е. функция выхода не зависит от входной переменной x (t ), называется автоматом Мура .

Таким образом, уравнения (2.15)-(2.19), полностью задающие
F -автомат, являются частным случаем уравнений (2.3) и (2.4), когда
система S – детерминированная и на её единственный вход поступает дискретный сигнал X .

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

y (t ) = y[ x (t )], t = 0, 1, 2, … .

Эта функция называется булевой, если алфавит X и Y , которым принадлежат значения сигналов x и y , состоят из двух букв.

По характеру отсчета дискретного времени конечные автоматы делятся на синхронные и асинхронные. В синхронных F -автоматах моменты времени, в которые автомат «считывает» входные сигналы, определяются принудительно синхронизирующими сигналами. После очередного синхронизирующего сигнала с учетом «считанного» и в соответствии с уравнениями (2.15)-(2.19) происходит переход в новое состояние и выдача сигнала на выходе, после чего автомат может воспринимать следующее значение входного сигнала. Таким образом, реакция автомата на каждое значение входного сигнала заканчивается за один такт, длительность которого определяется интервалом между соседними синхронизирующими сигналами. Асинхронный F -автомат считывает входной сигнал непрерывно и поэтому, реагируя на достаточно длинный входной сигнал постоянной величины x , он может, как следует из (2.15)-(2.19), несколько раз изменять состояние, выдавая соответствующее число выходных сигналов, пока не перейдет в устойчивое, которое уже не может быть изменено данным входным сигналом.

Возможные приложения F -схемы. Чтобы задать конечный F -автомат, необходимо описать все элементы множества F = <Z , X , Y , y, j, z 0 >, т.е. входной, внутренний и выходной алфавиты, а также функции переходов и выходов, причем среди множества состояний необходимо выделить состояние z 0 , в котором автомат находится в состоянии t = 0. Существуют несколько способов задания работы F -автоматов, но наиболее часто используются табличный, графический и матричный.

В табличном способе задаются таблицы переходов и выходов, строки которых соответствуют входным сигналам автомата, а столбцы – его состояниям. Первый слева столбец соответствует начальному состоянию z 0 . На пересечении i -й строки и k -го столбца таблицы переходов помещается соответствующее значение j(z k , x i ) функции переходов, а в таблице выходов – соответствующее значение y(z k , x i ) функции выходов. Для F -автомата Мура обе таблицы можно совместить.

Описание работы F -автомата Мили таблицами переходов j и выходов y иллюстрируется табл. 2.1, а описание F -автомата Мура – таблицей переходов (табл. 2.2).

Таблица 2.1

Переходы

j(z 0 , x 1)

j(z 1 , x 1)

j(z k , x 1)

j(z 0 , x 2)

j(z 1 , x 2)

j(z k , x 2)

j(z 0 , x i )

j(z 1 , x i )

j(z k , x i )

Выходы

y(z 0 , x 1)

y(z 1 , x 1)

y(z k , x 1)

y(z 0 , x 2)

y(z 1 , x 2)

y(z k , x 2)

y(z 0 , x i )

y(z 1 , x i )

y(z k , x i )

Таблица 2.2

j(z 0 , x 1)

j(z 1 , x 1)

j(z k , x 1)

j(z 0 , x 2)

j(z 1 , x 2)

j(z k , x 2)

j(z 0 , x i )

j(z 1 , x i )

j(z k , x i )

Примеры табличного способа задания F -автомата Мили F 1 приведены в табл. 2.3, а для F -автомата Мура F 2 – в табл. 2.4.

Таблица 2.3

Переходы

Выходы

Таблица 2.4

При графическом способе задания конечного автомата используется понятие направленного графа. Граф автомата представляет собой набор вершин, соответствующих различным состояниям автомата и соединяющих вершины дуг графа, соответствующих тем или иным переходам автомата. Если входной сигнал x k вызывает переход из состояния z i в состояние z j , то на графе автомата дуга, соединяющая вершину z i c вершиной z j , обозначается x k . Для того чтобы задать функцию выходов, дуги графа необходимо отметить соответствующими выходными сигналами. Для автоматов Мили эта разметка производится так: если входной сигнал x k действует на состояние z i , то получается дуга, исходящая из z i и помеченная x k ; эту дугу дополнительно отмечают выходным сигналом y = y(z i , x k ). Для автомата Мура аналогичная разметка графа такова: если входной сигнал x k , действуя на некоторое состояние автомата, вызывает переход в состояние z j , то дугу, направленную в z i и помеченную x k , дополнительно отмечают выходным
сигналом y = y(z j , x k ).

На рис. 2.4. а , б приведены заданные ранее таблицами F -автоматы Мили F 1 и Мура F 2 соответственно.

Рис. 2.4. Графы автоматов а – Мили и б – Мура

При матричном задании конечного автомата матрица соединений автомата квадратная С =||с ij ||, строки соответствуют исходным состояниям, а столбцы – состояния перехода. Элемент с ij = x k /y s , стоящий на пересечении
i -й строки и j -го столбца, в случае автомата Мили соответствует входному сигналу x k , вызывающему переход из состояния z i в состояние z j , и выходному сигналу y s , выдаваемому при этом переходе. Для автомата Мили F 1, рассмотренного выше, матрица соединений имеет вид:

x 2 / y 1 – x 1 / y 1

C 1 = x 1 / y 1 – x 2 / y 2 .

x 1 / y 2 x 2 /y 1

Для F -автомата Мура элемент с ij равен множеству входных сигналов на переходе (z i , z j ), а выход описывается вектором выходов

= y(z k ) ,

i -я компонента которого – выходной сигнал, отмечающий состояние z i .

Для рассмотренного выше F -автомата Мура F2 матрицы соединений и вектор выходов имеют вид:

x 1 x 2 у 1

x 2 x 1 у 1

C 2 = x 2 x 1 ; = у 3

x 2 x 1 у 2

x 2 x 1 у 3

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

Таким образом, понятие в дискретно-детерминированном подходе к исследованию на моделях свойств объектов является математической абстракцией, удобной для описания широкого класса процессов функционирования реальных объектов в автоматизированных системах управления. С помощью F- автомата можно описать объекты, для которых характерно наличие дискретных состояний, и дискретный характер работы во времени – это элементы и узлы ЭВМ, устройства контроля, регулирования и управления, системы временной и пространственной коммутации в технике обмена информацией и т.д.

Пример моделирования с помощью конечных автоматов

Пример построения конечного автомата (процессора)

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

На входе автомата: строка символов, представляющая вещественное число без знака.

На выходе автомата: пара целых чисел: мантисса и порядок или сообщение об ошибке, если число записано неправильно.

Пример.

1. 38.71 Е - 42 → (3871, -44);

2. .9 Е 21 → (9, 20);

3. 4.5.6 .9 → Ошибка;

4. 3. Е 4 → (3, 4);

5. 12 → (12, 0);

6. 1.2 → (12, -1).

На данном примере покажем образец для решения задачи о построении конечного распознающего автомата и обрабатывающего процессора. Разобьем этот процесс на несколько этапов.

1. Выписать один или несколько примеров характерных цепочек, на основе которых:

а) определить входной алфавит;

б) подписать под символами цепочек состояния, моделируя работу автомата;

в) выписать словесные описания состояний.

а) Входной алфавит A ={ц Е. + -}; (где ц – цифра 0..9)

б) Примеры.

Входная цепочка: 3 8 . 7 1 Е – 4 2

Состояния автомата: Ø 1 1 2 3 3 4 5 6 6

Входная цепочка: . 9 Е 2 1.

Состояния автомата: Ø7 3 4 6 6.

в) Ø начальное состояние; ожидание цифры мантиссы, либо точки.

1 – прочитана цифра первой части мантиссы; ожидание еще одной цифры или точки, или символа Е.

2 – прочитана точка; ожидание цифры дробной части или символа Е.

3 – прочитана цифра дробной части мантиссы; ожидание еще одной цифры или символа Е.

4 – прочитан символ Е; ожидание знаков операций +, -, или цифры порядка.

5 – прочитан знак порядка; ожидание цифры порядка.

6 – прочитана цифра порядка; ожидание еще одной цифры.

7 – прочитана точка в качестве 1-го символа входной цепочки; ожидание обязательной цифры дробной части мантиссы.

Е r - состояние ошибки.

2. Построить схему и таблицу переходов конечного автомата.


Все неотмеченные стрелками переходы ведут в состояние ошибки Er.

Допустимость

Е r

Здесь все пустые клетки соответствуют переходу в состояние ошибки Er.

3. Привести полученный автомат к минимальному виду.

Существуют специальные математические методы, позволяющие оптимизировать конечные автоматы, то есть находить избыточные состояния автомата. Существуют алгоритмы по приведению автомата к минимальному виду. Из результатов применения подобного алгоритма следует эквивалентность состояний 2 ~ 3.

В достижимости всех состояний нетрудно убедиться глядя на диаграмму переходов автомата. Таким образом для получения минимального приведенного автомата следует провести факторизацию, объединив состояния 2 и 3.

Для удобства дальнейшего описания переименуем состояния следующим образом:

Ниже приведена новая диаграмма и таблица переходов конечного автомата.

Новая таблица переходов:

Е r

Таблица вызова процедур процессора:

2 a

7 a

2 b

4 a

3 a

3 b

4 b

6 a

5 a

6 b

6 c

3 c

Е r

4. Построить процессор, обрабатывающий символ конца строки.

(В таблице все пустые клетки соответствуют вызову процедуры «НЕТ», отвергающей входную цепочку). Процедура Да заканчивает работу автомата, допуская входную цепочку и выдавая результат её обработки.

5. Дополнить переходы процессора именами процедур.

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

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

6. Ввести необходимые регистры – переменные, необходимые автомату для получения результата.

Число – регистр значащей части числа (целое число).

Порядок – регистр порядка (целое число).

Счетчик – регистр счетчика цифр, стоящих после (целое число).

Знак - (±1) – знак порядка.

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

2а: Число := ц

2в: Число := 10 * Число + ц

3а: Счетчик := 0

3в: Счетчик := Счетчик + 1

Число := 10 * Число + ц

3с: Число := ц; Счетчик =: 1

4а: Счетчик =: 0

5а: Знак := {+1, если а=’+’ или -1, если a=’-‘} (здесь а – входной символ.)

6а: Знак := +1

Порядок := ц

6в: Порядок := ц

6с: Порядок := 10 * Порядок + ц

Да1: Порядок := 0

Да2: Порядок := -Счетчик

Да3: Порядок := Знак * Порядок - Счетчик

Здесь символом Æ обозначено отсутствие всякого действия – пустая процедура. В тех случаях, когда целочисленному регистру присваивается символ (например: Счетчик =ц), подразумеваем неявное преобразование символа цифры в число им обозначаемое.

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

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

а) 67.89E-12┤ (6789, -14)

б) 2E3┤ (2,3)

в) .89┤ (3,-1)

Входной символ

Переход в сост.,

процедура

Значения регистров

Число

Порядок

Счетчик

Знак

1 (начальное)

6

67

67

0

678

1

6789

2

-1

6789

-14

1 (начальное)

2

0

3

+1

2

3

1 (начальное)

8

1

89

89

-2

Теория конечных автоматов

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

· конечный автомат может решать ряд легких задач компиляции. Лексический блок почти всегда строится на основе конечного автомата.

· работа конечного автомата отличается высоким быстродействием.

· моделирование конечного автомата требует фиксированного объема памяти, что упрощает управление памятью.

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

В литературе существует несколько отличных определений конечного автомата. Однако, общим в них является то, что конечный автомат моделирует вычислительное устройство с фиксированным объемом памяти, которое читает последовательности входных символов, принадлежащие некоторому входному множеству. Принципиальные различия в определениях связаны с тем, что автомат делает на выходе. Выходом автомата может быть указание на то « допустима » или нет данная входная цепочка. « Допустимой » называется правильно построенная или синтаксически правильная цепочка. Например, цепочка, которая должна изображать числовую константу, считается построенной неправильно, если она содержит две десятичные точки.

Определение: Конечный автомат - это формальная система, которая задается с помощью следующих объектов :

· конечным множеством входных символов;

· конечным множеством состояний;

· функцией переходов, которая каждой паре (текущее состояние, входной символ) ставит в соответствие новое состояние;

· начальным состоянием;

· подмножеством состояний, выделенных в качестве допускающих или заключительных.

Пример. Разберем работу контроллера, проверяющего четно или нечетно число единиц в произвольной цепочке, состоящей из нулей и единиц. Допустим, что соответствующий конечный автомат должен « допускать» все цепочки, содержащие нечетное число единиц и « отвергать » цепочки с четным их числом. Назовем этот автомат « контроллером четности ». Считаем, что символы, отличные от 0 и 1 нельзя подавать на вход автомата. Итак, входной алфавит контроллера есть множество {0, 1} . Считаем, что в конкретный момент времени конечный автомат имеет дело лишь с одним входным символом, а информацию о предыдущих символах входной цепочки сохраняет с помощью конечного множества состояний. В качестве множества состояний будем рассматривать множество { чет, нечет }, одно из этих состояний должно быть выбрано в качестве начального. Пусть им будет состояние {чет}, поскольку на первом шаге число прочитанных единиц равно нулю, а нуль есть четное число. При чтении очередного входного символа состояние автомата либо меняется, либо сохраняется прежним причем новое его состояние зависит от входного символа и текущего состояния. Такое изменение состояния называется переходом.



Работа автомата может описываться математически функцией переходов вида d(Sтек., x) = Sнов. Иначе это можно записать следующим образом:

d (чет., 0) = чет. d (чет., 1) = нечет.

d (нечет., 0) = нечет. d (нечет., 1) = чет.

Контроллер имеет единственное допускающее состояние НЕЧЕТ, а ЧЕТ есть « отвергающее » состояние. Отразим последовательность переходов автомата при подаче на его вход цепочки 1101.

ЧЕТ ® НЕЧЕТ ® ЧЕТ® ЧЕТ® НЕЧЕТ

Таблица переходов такого автомата имеет вид:

чет чет нечет
нечет нечет чет

Определение. Конечный автомат - это формальная система

S = { A, Q, d, l,V },

объекты которой следующие:

* A - конечное множество входных символов (множество

терминалов);

* Q - конечное множество внутренних состояний автомата

(множество нетерминалов);

* V - конечное множество выходных символов (выходной алфавит);

* d - функция переходов, для которой характерно A ´ Q ® Q;

* l - функция выходов, определяющая отображение вида.

алфавита : при i=1, ..., n . Число букв в этой последовательности называется длиной слова и обозначается |w| . Имеется одно специальное "пустое" слово длины 0. Будем обозначать его через На словах определена операция приписывания одного слова после другого, называемая конкатенацией : если слово w =w 1 ... w n , а слово v =v 1 ... v m , то их конкатенация - это слово w 1 ... w n v 1 ... v m длины n+m . Обычно знак конкатенации будем опускать и писать просто w v (по аналогии со знаком умножения в алгебре). Пустое слово - это единственное слово такое, что для любого слова w справедливо равенство . Операция конкатенации ассоциативна: для любых трех слов w, v и u , очевидно, имеет место равенство: (w v)u = w(v u) . Поэтому скобки при записи конкатенации нескольких слов будем опускать. Для представления нескольких конкатенаций одного и того же слова используют сокращенную "степенную форму" записи: . Например, a 3 b 4 c 2 - это сокращенная запись слова aaabbbbcc .

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

Конечные автоматы часто используются для определения тех или иных свойств слов , т.е. для распознавания языков : автомат, распознающий некоторый язык L должен по произвольному слову w ответить на вопрос " ? ". Для решения такой задачи функция выходов может быть заменена на проверку того, в какое состояние переходит автомат после получения входного слова w - "принимающее" или "отвергающее".

Определение 4.3 . Детерминированный конечный автомат (ДКА) - распознаватель - это система вида

включающая следующие компоненты:

Функцию называют программой автомата A и задают как список из m n команд вида .

Удобно также задавать функцию с помощью описанной выше таблицы размера n x m , строки которой соответствуют состояниям из Q , а столбцы - символам из входного алфавита и в которой на пересечении строки q i и столбца a j стоит состояние .

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

Определение 4.4 . Диаграмма ДКА - это ориентированный (мульти)граф D A =(Q, E) с помеченными ребрами, в котором выделена вершина- начальное состояние q 0 из каждой вершины выходит ребер, помеченных символами так, что для каждой и каждого символа имеется единственное ребро из q в вершину с меткой a .

Скажем, что представленный последовательностью ребер путь p=e 1 e 2 ... e t в диаграмме несет слово w=w 1 w 2 ... w t , если w i - это метка ребра e i (1 >= i >= t) . Если q - начальная вершина (состояние) этого пути, а q" - его заключительная вершина, то будем говорить, что слово w переводит q в q" .

Работа конечного автомата-распознавателя состоит в чтении входного слова и изменению состояний в зависимости от его символов.

Определение 4.5 . Назовем конфигурацией ДКА произвольную пару вида (q, w) , в которой и .

На множестве конфигураций введем отношение перехода за один шаг :

Если , то положим для каждого : .

Через обозначим рефлексивное и транзитивное замыкание .

Содержательно, означает, что автомат A , начав работу в состоянии q на слове w=w 1 ... w l , через некоторое конечное число шагов 0 <= k <= l прочтет первые k символов слова w и перейдет в состояние q" , а w" =w k+1 ... w l - это непрочтенный остаток слова w .

Определение 4.6 . ДКА A распознает (допускает, принимает) слово w , если для некоторого

Т.е. после обработки слова w автомат переходит в принимающее состояние.

Язык L A , распознаваемый (допускаемый, принимаемый) автоматом A , состоит из всех слов , распознаваемых этим автоматом.

Элементы теории автоматов

План:

1. Понятие автомата, принцип работы автомата

2. Способы задания конечных автоматов

3. Общие задачи теории автоматов

Теоретические сведения

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

Понятие автомата, принцип работы автомата

Понятие автомат рассматривается в двух аспектах:

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

2. Автомат – математическое понятие , обозначающее математическую модель реальных технических устройств. Автомат это абстрактное устройство, непонятно почему и как оно работает и, вообще, почему оно может работать. В этом аспекте автомат есть «черный ящик», который теоретически способен проводить некоторые действия. С точки зрения математики, абсолютно неважно что, как и почему производит те или иные действия.

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

Алгебраическая теория автоматов является разделом теоретической кибернетики, который изучает дискретные автоматы с абстрактной алгебраической точки зрения.



Общая теория автоматов содержит различные подразделы. В зависимости от предмета изучения она делится на абстрактную теорию автоматов и структурную теорию автоматов.

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

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

Определение конечных автоматов

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

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

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

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

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

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

1. Немецкий философ и алхимик Альберт Великий с 1216 по 1246 г., создавал «железного» слугу - автомат, который выполнял в доме обязанности привратника.

2. Астроном Иоганн Мюллер (Региамонтан) (1436-1476) создал механического орла, который приветствовал наклоном головы и движением крыльев въезд в Нюрнберг императора священной Римской империи Максимилиана II.

3. Механик Жак де Вакансон (1709-1782) – автор первого в мире автоматического ткацкого станка. Он создал образ механической утки, точной копии своего живого двойника - плавала, чистила перья, глотала с ладони зерна. Его механический флейтист, исполнявший одиннадцать музыкальных пьес, поражал людей, живших в те далекие годы.

4. Русский изобретатель 19 в. А. М. Гамулецкий создал целый механический кабинет, в котором было множество сконструированных им автоматов. Здесь в том числе была и говорящая голова чародея и амур, играющий на арфе, которые поражали воображение современников.

5. Первый примитивный арифмометр сконструировал в 1641 г. Блез Паскаль. Толчком для открытия были мучения его отца – налогового, инспектора, который днями и ночами работал с большими вычислениями. Изобретя арифмометр, восемнадцати летний сын избавил отца от сложных вычислений, а миру подарил первый калькулятор, производящий сложение и вычитание чисел.

6. Первый шахматный автомат был построен в 1890 г. испанским инженером Торресом Кеведо. Такой автомат мог разыграть лишь ладейный эндшпиль (король и ладья против короля).

7. Первую вычислительную машину с автоматическим управлением создал Чарльз Баббедж в 1822 г. Он спроектировал арифмометр , который имел запоминающие и арифметические устройства. Эти устройства стали прототипами аналогичных устройств современным ЭВМ.

Виды автоматов.

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

Любой автомат имеет собственные базовые множества, которые включают в себя:алфавит входа, алфавит выхода, множество состояний автомата.

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

В работе конечных цифровых автоматов важным понятием является время.

Автоматы можно классифицировать по различным признакам.

1. По виду деятельности - автоматы делятся на: информационные, управляющие и вычислительные.

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

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

К вычислительным автоматам относятся микрокалькуляторы, процессоры в ЭВМ и иные устройства, выполняющие вычисления.

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

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

3. Цифровые автоматы - автоматы, которые преобразует цифровую информацию. В таком автомате входные сигналы задаются в виде конечного множества мгновенных символов: их длительность настолько мала, что ею можно пренебречь. За фиксированное время происходит преобразование входных символов, а на выходе происходит скачкообразный переход из одного состояния в другое состояние.

4. Абстрактные автоматы - отображающие множество слов входного алфавита Х во множество слов выходного алфавита Y.

Абстрактный автомат есть:

~ Математическая модель,

~ Алгоритм действия некоторого преобразования кодовых последовательностей,

~ Закон преобразования входного алфавита в выходной.

5. Синхронные и асинхронные автоматы . В зависимости от того, одновременно или последовательно принимаются входной сигнал и сигнал смены состояний, автоматы делятся насинхронные и асинхронные автоматы.

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

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

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

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

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

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

В вероятностных автоматах эта зависимость связана еще и с некоторым случайным выбором.

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

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

Математическая модель цифрового автомата с одним входом задается пятью объектами:

X- конечное множество входных символов, входной алфавит:

Х= {x 1 (t), x 2 (t), …, x n (t)};

Y- конечное множество выходных символов, выходной алфавит:

У={y 1 (t), y 2 (t), …, y n (t)};

Q ~ конечное множество состояний автомата:

Q= {q 0 (t), q 1 (t), q 2 (t), …, q n (t)}, q 0 - начальное состояние;

δ(q, х ) - функция перехода автомата из одного состояния в другое: (Q х X) ®Q;

λ(q, х ) ~ функция выхода автомата: (Q x Х) ® Y.

Таким образом, конечный автомат С= (X, Q, У, δ, λ.) определяется рекуррентными соотношениями

q(0) = q 0 , q(t + I) = δ (g(t), х(t)), y(t) = λ (g(t), х(t)),

t- дискретизированный момент времен или это есть образ монотонной функции t :. Т ® N, причем Т - обычное непрерывное время, N - множество натуральных чисел.

Все время работы Т разбивается на конечное число интервалов, на границе которых происходит изменение состояния автомата. При этом t(Г 0) – показывает число изменений, произошедших до момента времени Г 0 .

Примером дискретизации служит обычный кинематограф: время разбито на интервалы длительностью 1/24с. Человеческий глаз воспринимает следование дискретных кадров как непрерывное движение.

9. Синхронные автоматы делятся на автоматы Мили и автоматы Мура . В зависимости от способа организации функции выхода синхронные автоматы делятся на автоматы Мили (автоматы I рода) и автоматы Мура(автоматы II рода).

В автоматах Мили - выходной сигнал y (t) x (t) и состоянием q (t- 1) автомата в предшествующий момент времени (t- 1). Математической моделью таких автоматов служит система уравнений:

q(t) = δ (q(t-1), х(t)) и y(t) = λ (q(t-1), х(t)),

В автоматах Мура выходной сигнал y (t) однозначно определяется входным сигналом x (t) и состоянием q (t) в данный момент времени t. Математической моделью таких автоматов является система:

q(t) = δ (q(t-1), х(t)) и y(t) = λ (q(t)),

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

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

11 Логические автоматы – есть автоматы у которых входной алфавит состоит из 2 т двоичных наборов длины т, а выходной - из 2 n двоичных наборов длины п. Для логических комбинационных автоматов функция выхода имеет вид системы п логических функций от т переменных.

В статье рассмотрены простые конечные автоматы и их реализация на C++ с помощью switch-конструкций, таблиц времени исполнения и библиотеки Boost Statechart .

Введение

Грубо говоря, конечный автомат (Finite State Machine), глазами пользователя – это черный ящик, в который можно что-то передать и что-то оттуда получить. Это очень удобная абстракция, которая позволяет скрыть сложный алгоритм, кроме того конечные автоматы очень эффективны.

Конечные автоматы изображают в виде диаграмм состоящих из состояний и переходов. Поясню на простом примере:

Как вы наверное догадались – это диаграмма состояний лампочки. Начальное состояние обозначается черным кружком, переходы стрелками, некоторые стрелки подписаны – это события после которых автомат переходит в другое состояние. Итак, сразу из начального состояния, мы попадаем в состояние Light Off – лампа не горит. Если нажать кнопку, то автомат изменит свое состояние и перейдет по стрелке помеченной Push Button , в состояние Light On – лампа горит. Перейти из этого состояния можно опять же по стрелке, после нажатия кнопки, в состояние Light Off .

Также широко используются таблицы переходов:

Практическое применение автоматов

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

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

Для примера мы реализуем автомат для подсчета чисел и слов в тексте. Для начала договоримся, что числом будет считаться последовательность цифр от 0 до 9 произвольной длины, окруженная пробельными символами (пробел, табуляция, перевод строки). Словом будет считаться последовательность произвольной длины состоящая из букв и также окруженная пробельными символами.

Рассмотрим диаграмму:

Из начального состояния мы попадаем в состояние Start . Проверяем текущий символ, и если он является буквой, то переходим в состояние Word по стрелке помеченной как Letter . Это состояние предполагает, что в данный момент мы рассматриваем слово, анализ дальнейших символов, либо подтвердит данное предположение, либо опровергнет. Итак, рассматриваем следующий символ, если он является буквой, то состояние не изменяется (обратите внимание на круговую стрелку помеченную как Letter ). Если символ не является буквой, а соответствует пробельному символу, то это означает, что предположение было верным и мы обнаружили слово (делаем переход по стрелке Space в состояние Start ). Если символ не является, ни буквой, ни пробелом, значит мы ошиблись в предположении и последовательность которую мы рассматриваем, не является словом (переходим по стрелке Unknown в состояние Skip ).

В состоянии Skip мы находимся до тех пор, пока не будет встречен пробельный символ. После того как пробел был обнаружен мы переходим по стрелке Space в состояние Start . Это нужно, чтобы полностью пропустить строку не соответствующую нашему шаблону поиска.

После перехода в состояние Start , поиск цикл повторяется с начала. Ветвь с распознаванием чисел аналогична ветви распознавания слов.

Автомат с использованием switch-инструкций

Первое – возможные состояния:

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

const size_t length = text.length () ; for (size_t i = 0 ; i ! = length; ++ i) { const char current = text[ i] ; switch (state) { case State_Start: if (std:: isdigit (current) ) { state = State_Number; } else if (std:: isalpha (current) ) { state = State_Word; } break ; case State_Number: if (std:: isspace (current) ) {

Здесь смотрим на диаграмму – текущее состояние Number , событие Space (встречен пробельный символ), а значит найдено число:

FoundNumber() ; state = State_Start; } else if (! std:: isdigit (current) ) { state = State_Skip; } break ; case State_Word: if (std:: isspace (current) ) { FoundWord() ; state = State_Start; } else if (! std:: isalpha (current) ) { state = State_Skip; } break ; case State_Skip: if (std:: isspace (current) ) { state = State_Start; } break ; } }

Итог:

Высокая эффективность

Простота реализации для простых алгоритмов

— Тяжело поддерживать

Интерпретация времени выполнения

Идея данного подхода проста – надо создать таблицу переходов, заполнить ее, и потом, при наступлении события, найди в таблице следующее состояние и сделать переход:

enum Events { Event_Space, Event_Digit, Event_Letter, Event_Unknown } ; void ProcessEvent(Events event) ; ... struct Transition { States BaseState_; Events Event_; States TargetState_; } ; void AddTransition(States fromState, Events event, States toState) ; ... typedef std:: vector < transition> TransitionTable; TransitionTable Transitions_; States CurrentState_;

Заполнение таблицы:

AddTransition(State_Start, Event_Digit, State_Number) ; AddTransition(State_Start, Event_Letter, State_Word) ; AddTransition(State_Number, Event_Space, State_Start) ; AddTransition(State_Number, Event_Letter, State_Skip) ; AddTransition(State_Number, Event_Unknown, State_Skip) ; AddTransition(State_Word, Event_Space, State_Start) ; AddTransition(State_Word, Event_Digit, State_Skip) ; AddTransition(State_Word, Event_Unknown, State_Skip) ; AddTransition(State_Skip, Event_Space, State_Start) ;

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

Чтобы автомат, при наступлении некоторых событий, мог оповестить некоторый код, можно добавить в структуру с информацией о переходе (Transition ) указатель на функцию (Action ), которая будет вызываться:

typedef void (DynamicMachine:: * Action) () ; struct Transition { States BaseState_; Events Event_; States TargetState_; Action Action_; } ; ... void AddTransition(States fromState, Events event, States toState, Action action) ; ... AddTransition (State_Number, Event_Space, State_Start, & DynamicMachine:: FoundNumber ) ;

Итог:

Гибкость и наглядность

Проще поддерживать

— Меньшая производительность по сравнению с switch-блоками

Интерпретация времени исполнения. Оптимизация по скорости

Можно ли объединить наглядность со скоростью? Сделать автомат настолько же эффективным, как автомат на switch-блоках вряд ли удастся, но сократить разрыв можно. Для этого надо из таблицы, построить матрицу, такую, чтобы для получения информации о переходе не выполнять поиск, а сделать выборку по номеру состояния и события:

Достигается результат, за счет расхода памяти.

Итог:

Гибкость, наглядность

Эффективен

— Расход памяти (скорее всего несущественно)

Boost Statechart

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

Итак, сначала определим события:

namespace Events { struct Digit : boost:: statechart :: event < Digit> { } ; struct Letter : boost:: statechart :: event < Letter> { } ; struct Space : boost:: statechart :: event < Space> { } ; struct Unknown : boost:: statechart :: event < Unknown> { } ; }

Саму машину (обратите внимание, что второй параметр шаблона – начальное состояние):

struct Machine : boost:: statechart :: state_machine < Machine, States:: Start > { } ;

И собственно сами состояния. Внутри состояний требуется определить тип описывающий переходы (reactions ), а если переходов несколько, то перечислить их в списке типов boost::mpl::list . Второй параметр шаблона simple_state – тип описывающий машину. Переходы описываются параметрами шаблона transition, парой Событие — Следующее состояние :

namespace States { struct Start : boost:: statechart :: simple_state < Start, Machine> < boost:: statechart :: transition < Events:: Digit , States:: Number >< Events:: Letter , States:: Word > > reactions; } ; struct Number : boost:: statechart :: simple_state < Number, Machine> { typedef boost:: mpl :: list < boost:: statechart :: transition < Events:: Space , States:: Start > , boost:: statechart :: transition < Events:: Letter , States:: Skip > , boost:: statechart :: transition < Events:: Unknown , States:: Skip > > reactions; } ; struct Word : boost:: statechart :: simple_state < Word, Machine> { typedef boost:: mpl :: list < boost:: statechart :: transition < Events:: Space , States:: Start > , boost:: statechart :: transition < Events:: Digit , States:: Skip > , boost:: statechart :: transition < Events:: Unknown , States:: Skip > > reactions; } ; struct Skip : boost:: statechart :: simple_state < Skip, Machine> { typedef boost:: statechart :: transition < Events:: Space , States:: Start > reactions; } ; }

Машина построена, осталось только инициализировать ее и можно использовать:

Machine machine; machine.initiate () ; ... machine .process_event (Events:: Space () ) ;

Итог:

Гибкость, расширяемость

— Эффективность

Быстродействие

Я написал тестовую программу для проверки быстродействия построенных автоматов. Через автоматы я прогнал текст размером ~17 Мб. Вот результаты прогона:

Loading text Text length: 17605548 bytes 0.19 s Running BoostMachine Words: 998002, numbers: 6816 0.73 s Running DynamicMachine Words: 998002, numbers: 6816 0.56 s Running FastDynamicMachine Words: 998002, numbers: 6816 0.29 s Running SimpleMachine Words: 998002, numbers: 6816 0.20 s

Что осталось не рассмотренным

Неохваченными остались еще несколько реализаций конечных автоматов (рекомендую http://www.rsdn.ru/article/alg/Static_Finite_State_Machine.xml и http://www.rsdn.ru/article/alg/FiniteStateMachine.xml), генераторы строящие автоматы из описаний, библиотека Meta State Machine из Boost версии 1.44.0, а также формальные описания конечных автоматов. Со всем перечисленным любопытный читатель может ознакомиться самостоятельно.