Конечный автомат ( FSM ) или конечный автомат ( FSA , множественное число: автоматы ), конечный автомат или просто конечный автомат — это математическая модель вычислений . Это абстрактная машина , которая может находиться ровно в одном из конечного числа состояний в любой момент времени. FSM может переходить из одного состояния в другое в ответ на некоторые входные данные ; изменение из одного состояния в другое называется переходом . [1] FSM определяется списком своих состояний, своим начальным состоянием и входными данными, которые запускают каждый переход. Конечные автоматы бывают двух типов — детерминированные конечные автоматы и недетерминированные конечные автоматы . [2] Для любого недетерминированного конечного автомата можно построить эквивалентный детерминированный.
Поведение конечных автоматов можно наблюдать во многих устройствах в современном обществе, которые выполняют предопределенную последовательность действий в зависимости от последовательности событий, с которыми они сталкиваются. Простыми примерами являются: торговые автоматы , которые выдают продукты, когда вносится правильная комбинация монет; лифты , последовательность остановок которых определяется этажами, запрашиваемыми пассажирами; светофоры , которые меняют последовательность, когда автомобили ждут; кодовые замки , которые требуют ввода последовательности цифр в правильном порядке.
Конечный автомат имеет меньшую вычислительную мощность, чем некоторые другие модели вычислений, такие как машина Тьюринга . [3] Различие в вычислительной мощности означает, что существуют вычислительные задачи, которые может выполнять машина Тьюринга, но не может выполнять конечный автомат. Это происходит потому, что память конечного автомата ограничена числом имеющихся у него состояний. Конечный автомат имеет ту же вычислительную мощность, что и машина Тьюринга, которая ограничена тем, что ее головка может выполнять только операции «чтения» и всегда должна двигаться слева направо. Конечные автоматы изучаются в более общей области теории автоматов .
Примером простого механизма, который может быть смоделирован конечным автоматом, является турникет . [ 4] [5] Турникет, используемый для контроля доступа в метро и парки развлечений, представляет собой ворота с тремя вращающимися рычагами на уровне талии, один из которых расположен поперек входа. Изначально рычаги заблокированы, блокируя вход и не позволяя посетителям проходить через них. Вкладывание монеты или жетона в щель на турникете разблокирует рычаги, позволяя одному клиенту пройти. После того, как клиент проходит, рычаги снова блокируются, пока не будет вставлена еще одна монета.
Рассматриваемый как конечный автомат, турникет имеет два возможных состояния: Заблокирован и Разблокирован . [4] Существует два возможных входа, которые влияют на его состояние: помещение монеты в щель ( coin ) и нажатие рычага ( push ). В заблокированном состоянии нажатие на рычаг не имеет никакого эффекта; независимо от того, сколько раз дается входной push , он остается в заблокированном состоянии. Помещение монеты — то есть предоставление автомату ввода монеты — изменяет состояние с Locked на Unlocked . В разблокированном состоянии помещение дополнительных монет не имеет никакого эффекта; то есть предоставление дополнительных вводов монет не изменяет состояние. Клиент, проталкивающийся через рычаги, дает вход push и сбрасывает состояние на Locked .
Машину состояний турникета можно представить в виде таблицы переходов состояний , показывающей для каждого возможного состояния переходы между ними (на основе входных данных, поданных в машину) и выходные данные, получаемые в результате каждого входного сигнала:
Машина состояний турникета также может быть представлена направленным графом, называемым диаграммой состояний (выше) . Каждое состояние представлено узлом ( кругом ) . Ребра ( стрелки ) показывают переходы из одного состояния в другое. Каждая стрелка помечена входом, который запускает этот переход. Вход, который не вызывает изменения состояния (например, ввод монеты в состоянии Unlocked ), представлен круглой стрелкой, возвращающей в исходное состояние. Стрелка в узел Locked от черной точки указывает, что это начальное состояние.
Состояние — это описание статуса системы, ожидающей выполнения перехода . Переход — это набор действий, которые должны быть выполнены при выполнении условия или при получении события. Например, при использовании аудиосистемы для прослушивания радио (система находится в состоянии «радио») получение стимула «следующий» приводит к переходу на следующую станцию. Когда система находится в состоянии «CD», стимул «следующий» приводит к переходу на следующий трек. Одинаковые стимулы запускают различные действия в зависимости от текущего состояния.
В некоторых представлениях конечных автоматов также возможно связывать действия с состоянием:
Используется несколько типов таблиц переходов состояний . Наиболее распространенное представление показано ниже: комбинация текущего состояния (например, B) и ввода (например, Y) показывает следующее состояние (например, C). Полная информация о действии не описана напрямую в таблице и может быть добавлена только с помощью сносок. [ необходимо дополнительное объяснение ] Определение FSM, включающее полную информацию о действии, возможно с использованием таблиц состояний (см. также виртуальный конечный автомат ).
Унифицированный язык моделирования имеет нотацию для описания конечных автоматов. Конечные автоматы UML преодолевают ограничения [ требуется ссылка ] традиционных конечных автоматов, сохраняя при этом свои основные преимущества. Конечные автоматы UML вводят новые концепции иерархически вложенных состояний и ортогональных областей , расширяя при этом понятие действий . Конечные автоматы UML обладают характеристиками как автоматов Мили , так и автоматов Мура . Они поддерживают действия, зависящие как от состояния системы, так и от события -триггера , как в автоматах Мили, а также действия входа и выхода , которые связаны с состояниями, а не с переходами, как в автоматах Мура. [ требуется ссылка ]
Язык спецификаций и описаний — это стандарт МСЭ , включающий графические символы для описания действий при переходе:
SDL встраивает базовые типы данных, называемые «абстрактными типами данных», язык действий и семантику выполнения, чтобы сделать конечный автомат исполняемым. [ необходима ссылка ]
Существует большое количество вариантов представления конечного автомата, подобного показанному на рисунке 3.
Помимо использования в моделировании реактивных систем, представленных здесь, конечные автоматы играют важную роль во многих различных областях, включая электротехнику , лингвистику , информатику , философию , биологию , математику , программирование видеоигр и логику . Конечные автоматы — это класс автоматов, изучаемых в теории автоматов и теории вычислений . В информатике конечные автоматы широко используются в моделировании поведения приложений ( теория управления ), проектировании аппаратных цифровых систем , программной инженерии , компиляторах , сетевых протоколах и вычислительной лингвистике .
Конечные автоматы можно разделить на акцепторы, классификаторы, преобразователи и секвенсоры. [6]
Акцепторы (также называемые детекторами или распознавателями ) выдают двоичный вывод, указывающий, принят ли полученный ввод. Каждое состояние акцептора либо принимает, либо не принимает . После того, как весь ввод был получен, если текущее состояние является принимающим, ввод принимается; в противном случае он отклоняется. Как правило, ввод представляет собой последовательность символов (знаков); действия не используются. Начальное состояние также может быть принимающим, и в этом случае акцептор принимает пустую строку. Пример на рисунке 4 показывает акцептор, который принимает строку «nice». В этом акцепторе единственным принимающим состоянием является состояние 7.
(Возможно, бесконечное) множество последовательностей символов, называемое формальным языком , является регулярным языком , если существует некоторый акцептор, который принимает именно этот набор. Например, множество двоичных строк с четным числом нулей является регулярным языком (ср. рис. 5), тогда как множество всех строк, длина которых является простым числом, не является таковым. [7] : 18, 71
Акцептор также может быть описан как определяющий язык, который будет содержать каждую строку, принятую акцептором, но ни одну из отклоненных; этот язык принимается акцептором . По определению, языки, принимаемые акцепторами, являются регулярными языками .
Задача определения языка, принимаемого данным акцептором, является примером задачи алгебраического пути , которая сама по себе является обобщением задачи кратчайшего пути на графы с ребрами, взвешенными элементами (произвольного) полукольца . [8] [9] [ жаргон ]
Пример принимающего состояния показан на рис. 5: детерминированный конечный автомат (ДКА), который определяет, содержит ли двоичная входная строка четное число нулей.
S 1 (которое также является начальным состоянием) указывает состояние, в котором было введено четное число нулей. Таким образом, S 1 является принимающим состоянием. Этот акцептор завершит работу в принимающем состоянии, если двоичная строка содержит четное число нулей (включая любую двоичную строку, не содержащую нулей). Примерами строк, принимаемых этим акцептором, являются ε ( пустая строка ), 1, 11, 11..., 00, 010, 1010, 10110 и т. д.
Классификаторы являются обобщением акцепторов, которые производят n- арный вывод, где n строго больше двух. [10]
Преобразователи производят вывод на основе заданного ввода и/или состояния с использованием действий. Они используются для приложений управления и в области вычислительной лингвистики .
В приложениях управления различают два типа:
Секвенсоры (также называемые генераторами ) являются подклассом акцепторов и преобразователей, которые имеют однобуквенный входной алфавит. Они производят только одну последовательность, которую можно рассматривать как выходную последовательность выходов акцептора или преобразователя. [6]
Еще одно различие — между детерминированными ( DFA ) и недетерминированными ( NFA , GNFA ) автоматами. В детерминированном автомате каждое состояние имеет ровно один переход для каждого возможного входа. В недетерминированном автомате вход может привести к одному, более чем одному или отсутствию перехода для данного состояния. Алгоритм построения powerset может преобразовать любой недетерминированный автомат в (обычно более сложный) детерминированный автомат с идентичной функциональностью.
Конечный автомат с единственным состоянием называется «комбинаторным FSM». Он допускает действия только при переходе в состояние. Эта концепция полезна в случаях, когда требуется совместная работа нескольких конечных автоматов, и когда удобно рассматривать чисто комбинаторную часть как форму FSM для соответствия инструментам проектирования. [11]
Существуют и другие наборы семантик, которые можно использовать для представления конечных автоматов. Например, существуют инструменты для моделирования и проектирования логики для встроенных контроллеров. [12] Они объединяют иерархические конечные автоматы (обычно имеющие более одного текущего состояния), потоковые графы и таблицы истинности в один язык, что приводит к другому формализму и набору семантик. [13] Эти диаграммы, как и оригинальные конечные автоматы Харела , [14] поддерживают иерархически вложенные состояния, ортогональные области , действия состояний и действия переходов. [15]
В соответствии с общей классификацией встречаются следующие формальные определения.
Детерминированный конечный автомат или детерминированный конечный акцептор представляет собой пятерку , где:
Как для детерминированных, так и для недетерминированных FSM принято разрешать быть частичной функцией , т. е. не обязательно определять для каждой комбинации и . Если FSM находится в состоянии , следующим символом является и не определен, то может объявить об ошибке (т. е. отклонить ввод). Это полезно в определениях машин общего состояния, но менее полезно при преобразовании машины. Некоторые алгоритмы в их форме по умолчанию могут требовать полных функций.
Конечный автомат имеет ту же вычислительную мощность, что и машина Тьюринга , которая ограничена таким образом, что ее головка может выполнять только операции «чтения» и всегда должна двигаться слева направо. То есть, каждый формальный язык, принятый конечным автоматом, принимается таким видом ограниченной машины Тьюринга, и наоборот. [16]
Конечный преобразователь представляет собой шестерку , где:
Если выходная функция зависит от состояния и входного символа ( ), то определение соответствует модели Мили и может быть смоделировано как автомат Мили . Если выходная функция зависит только от состояния ( ), то определение соответствует модели Мура и может быть смоделировано как автомат Мура . Конечный автомат без выходной функции вообще называется полуавтоматом или системой переходов .
Если мы проигнорируем первый выходной символ автомата Мура, , то его можно легко преобразовать в эквивалентный по выходу автомат Мили, установив выходную функцию каждого перехода Мили (т. е. маркируя каждое ребро) выходным символом, заданным для конечного состояния Мура. Обратное преобразование менее просто, поскольку состояние автомата Мили может иметь разные выходные метки на своих входящих переходах (ребрах). Каждое такое состояние должно быть разделено на несколько состояний автомата Мура, по одному для каждого инцидентного выходного символа. [17]
Оптимизация FSM означает поиск машины с минимальным числом состояний, которая выполняет ту же функцию. Самый быстрый известный алгоритм, делающий это, — алгоритм минимизации Хопкрофта . [18] [19] Другие методы включают использование таблицы импликации или процедуры редукции Мура. [20] Кроме того, ациклические FSA могут быть минимизированы за линейное время . [21]
В цифровой схеме FSM может быть построен с использованием программируемого логического устройства , программируемого логического контроллера , логических вентилей и триггеров или реле . Более конкретно, для аппаратной реализации требуется регистр для хранения переменных состояния, блок комбинационной логики , который определяет переход состояния, и второй блок комбинационной логики, который определяет выход FSM. Одной из классических аппаратных реализаций является контроллер Ричардса .
В машине Медведева выход напрямую подключен к триггерам состояния, что минимизирует временную задержку между триггерами и выходом. [22] [23]
Благодаря кодированию состояний для машин с низким энергопотреблением можно оптимизировать потребление энергии.
Для создания программных приложений с использованием конечных автоматов обычно используются следующие концепции:
Конечные автоматы часто используются в интерфейсе компиляторов языков программирования. Такой интерфейс может включать несколько конечных автоматов, которые реализуют лексический анализатор и парсер. Начиная с последовательности символов, лексический анализатор строит последовательность языковых токенов (таких как зарезервированные слова, литералы и идентификаторы), из которых парсер строит синтаксическое дерево. Лексический анализатор и парсер обрабатывают обычные и контекстно-свободные части грамматики языка программирования. [24]
Конечные процессы цепи Маркова также известны как подсдвиги конечного типа .