Недетерминированный конечный автомат (НКА, англ. nondeterministic finite automaton, NFA) — это детерминированный конечный автомат (ДКА, англ. deterministic finite automaton, DFA), который не выполняет следующие условия:
В частности, любой ДКА является также НКА.
Используя алгоритм конструкции подмножеств[англ.], любой НКА можно преобразовать в эквивалентный ДКА, то есть ДКА, распознающий тот же самый формальный язык[1]. Подобно ДКА, НКА распознаёт только регулярные языки.
НКА предложили в 1959 году Михаэль О. Рабин и Дана Скотт[2], которые показали его эквивалентность ДКА. НКА используется в реализации регулярных выражений — построение Томпсона[англ.] является алгоритмом для преобразования регулярного выражения в НКА, который может эффективно распознавать шаблон строк. Обратно, алгоритм Клини[англ.] можно использовать для преобразования НКА в регулярное выражение, размер которого в общем случае экспоненциально зависит от размера автомата.
НКА обобщён многими путями, например: недетерминированным конечным автоматом с ε-переходами, преобразователями с конечным числом состояний, автоматами с магазинной памятью, альтернирующими автоматами, ω-автоматами и вероятностными автоматами. Кроме ДКА известны другие специальные случаи НКА — однозначные конечные автоматы[англ.] (англ. unambiguous finite automata, UFA) и самопроверочные конечные автоматы[англ.] (англ. self-verifying finite automata, SVFA).
Есть несколько неформальных эквивалентных описаний:
Для более элементарного введения в формальное определение см. статью «Теория автоматов».
НКА формально представляется как 5-кортеж ( Q , Σ , Δ , q 0 , F ) {\displaystyle (Q,\Sigma ,\Delta ,q_{0},F)} , состоящий из:
Здесь P ( Q ) {\displaystyle P(Q)} означает степень множества Q {\displaystyle Q} .
Если дан НКА M = ( Q , Σ , Δ , q 0 , F ) {\displaystyle M=(Q,\Sigma ,\Delta ,q_{0},F)} , он распознаёт язык, который обозначается как L ( M ) {\displaystyle L(M)} и определяется как множество всех строк над алфавитом Σ {\displaystyle \Sigma } , принимаемых автоматом M {\displaystyle M} .
В общих чертах согласно неформальным объяснениям выше, существует несколько эквивалентных формальных определений строки w = a 1 a 2 . . . a n {\displaystyle w=a_{1}a_{2}...a_{n}} , принимаемых автоматом M {\displaystyle M} :
Определение автомата выше использует одно начальное состояние, что не является обязательным условием. Иногда НКА определяется с множеством начальных состояний. Существует простое построение[англ.], которое переносит НКА с несколькими начальными состояниями в НКА с одним начальным состоянием.
Следующий автомат M {\displaystyle M} с двоичным алфавитом определяет, кончается ли входная строка единицей. Пусть M = ( { p , q } , { 0 , 1 } , Δ , p , { q } ) {\displaystyle M=(\{p,q\},\{0,1\},\Delta ,p,\{q\})} , где функция переходов Δ {\displaystyle \Delta } может быть определена следующей таблицей переходов состояний[англ.] (сравните с верхним рисунком слева):
Поскольку множество Δ ( p , 1 ) {\displaystyle \Delta (p,1)} содержит более одного состояния, автомат M {\displaystyle M} является недетерминированным. Язык автомата M {\displaystyle M} можно описать как регулярный язык, задаваемый регулярным выражением (0|1)*1.
(0|1)*1
Все возможные последовательности состояний для входной строки «1011» показаны на нижнем рисунке. Строка принимается автоматом M {\displaystyle M} , поскольку одна из последовательностей состояний удовлетворяет вышеописанному определению. Не имеет значения факт, что остальные последовательности не приводят к успеху. Рисунок можно интерпретировать двумя способами:
Возможность чтения одного рисунка двумя способами также показывает эквивалентность двух объяснений выше.
Для контраста строка «10» отвергается автоматом M {\displaystyle M} (все возможные последовательности состояний для входной строки для данного входа показаны на верхнем правом рисунке), поскольку не существует пути, достигающего конечного состояния q {\displaystyle q} после чтения конечного символа 0. Хотя состояние q {\displaystyle q} может быть достигнуто после получения первого символа «1», это не означает, что входная строка «10» приемлема. Это лишь означает, что была бы приемлема входная строка «1».
Детерминированный конечный автомат (ДКА, англ. Deterministic finite automaton, DFA) можно рассматривать как специальный вид НКА, в котором для любого состояния и букв алфавита функция перехода имеет лишь одно результирующее состояние. Таким образом ясно, что любой формальный язык, который можно распознать с помощью ДКА, можно распознать и с помощью НКА.
В обратную сторону для любого НКА существует ДКА, распознающий тот же самый формальный язык. ДКА может быть построен[англ.] с помощью конструкции подмножеств[англ.].
Этот результат показывает, что НКА, несмотря на его большую гибкость, не в состоянии распознать языки, которые нельзя распознать никаким ДКА. Это важно также на практике, чтобы конвертировать более простые по структуре НКА в более эффективные в вычислительном отношении ДКА. Однако, если НКА имеет n состояний, результирующий ДКА может иметь до 2n состояний, что иногда делает построение непрактичным для больших НКА.
Недетерминированный конечный автомат с ε-переходами (НКА-ε) является дальнейшим обобщением уже для НКА. В этом автомате функции переходов разрешается иметь пустую строку ε в качестве входа. Переход без использования входного символа называется ε-переходом. В диаграмме состояний эти переходы обычно помечаются греческой буквой ε. ε-переходы дают удобный способ моделирования систем, текущее состояние которых в точности не известно. Например, если мы моделируем систему, текущее состояние которой не ясно (после обработки некоторой входной строки) и может быть либо q, либо q', мы можем добавить ε-переход между этими двумя состояниями, переводя автомат в оба состояния одновременно.
НКА-ε формально представляется 5-кортежем, ( Q , Σ , Δ , q 0 , F ) {\displaystyle (Q,\Sigma ,\Delta ,q_{0},F)} , который состоит из:
Здесь P ( Q ) {\displaystyle P(Q)} означает степень множества Q {\displaystyle Q} , а ε означает пустую строку.
Для состояния q ∈ Q {\displaystyle q\in Q} пусть E ( q ) {\displaystyle E(q)} означает множество состояний, достижимых из q {\displaystyle q} следующими ε-переходами в функции переходов Δ {\displaystyle \Delta } , а именно, p ∈ E ( q ) {\displaystyle p\in E(q)} если существует последовательность состояний q 1 , . . . , q k {\displaystyle q_{1},...,q_{k}} таких, что:
Множество E ( q ) {\displaystyle E(q)} известно как ε-замыкание состояния q {\displaystyle q} .
ε-замыкание определяется также для множества состояний. ε-замыкание множества состояний, P {\displaystyle P} , НК-автомата определяется как множество состояний, достижимых из элементов множества P {\displaystyle P} по ε-переходам. Формально, для P ⊆ Q E ( P ) = ∪ q ∈ P E ( q ) {\displaystyle P\subseteq QE(P)=\cup _{q\in P}E(q)} .
Пусть w = a 1 a 2 . . . a n {\displaystyle w=a_{1}a_{2}...a_{n}} будет строкой над алфавитом Σ {\displaystyle \Sigma } . Автомат M {\displaystyle M} принимает строку w {\displaystyle w} , если существует последовательность состояний r 0 , r 1 , . . . , r n {\displaystyle r_{0},r_{1},...,r_{n}} в Q {\displaystyle Q} со следующими условиями:
Пусть M {\displaystyle M} будет НКА-ε с двоичным алфавитом, который определяет, если входная строка содержит чётное число нулей или чётное число единиц. Заметим, что 0 случаев является чётным числом.
В формальных обозначениях, пусть M = ( { S 0 , S 1 , S 2 , S 3 , S 4 } , { 0 , 1 } , Δ , S 0 , { S 1 , S 3 } ) {\displaystyle M=(\{S_{0},S_{1},S_{2},S_{3},S_{4}\},\{0,1\},\Delta ,S_{0},\{S_{1},S_{3}\})} , где отношение переходов Δ {\displaystyle \Delta } может быть определено такой таблицей переходов состояний[англ.]:
M {\displaystyle M} можно рассматривать как объединение двух ДКА — один с состояниями { S 1 , S 2 } {\displaystyle \{S_{1},S_{2}\}} , а другой с состояниями { S 3 , S 4 } {\displaystyle \{S_{3},S_{4}\}} . Язык M {\displaystyle M} можно описать как регулярный язык, заданный регулярным выражением (1*(01*01*)*) ∪ (0*(10*10*)*). Мы определяем M {\displaystyle M} с помощью ε-переходов, но M {\displaystyle M} можно определить и без них.
Чтобы показать, что НКА-ε эквивалентен НКА, сначала обратим внимание на то, что НКА является частным случаем НКА-ε, остаётся показать, что для любого НКА-ε существует эквивалентный НКА.
Пусть A = ( Q , Σ , Δ , q 0 , F ) {\displaystyle A=(Q,\Sigma ,\Delta ,q_{0},F)} будет НКА-ε. НКА A ′ = ( Q , Σ , Δ ′ , E ( q 0 ) , F ) {\displaystyle A'=(Q,\Sigma ,\Delta ',E(q_{0}),F)} эквивалентен A {\displaystyle A} , где для любого a ∈ Σ {\displaystyle a\in \Sigma } и q ∈ Q {\displaystyle q\in Q} Δ ′ ( q , a ) = E ( Δ ( q , a ) ) {\displaystyle \Delta '(q,a)=E(\Delta (q,a))} .
Тогда НКА-ε эквивалентен НКА. Поскольку НКА эквивалентен ДКА, НКА-ε также эквивалентен ДКА.
Говорят, что НКА замкнут относительно (бинарной/унарной) операции. Если НКА распознаёт языки, которые получаются путём применения этой операции к распознаваемым автоматом НКА языкам. НКА замкнуты относительно следующих операций.
Поскольку НКА эквивалентны недетерминированным конечным автоматам с ε-переходами (НКА-ε), замыкания выше доказываются с помощью свойств замыкания НКА-ε. Из свойств замыкания выше вытекает, что НКА распознают только регулярные языки.
НКА могут быть построены из любого регулярного выражения с помощью алгоритма Томпсона[англ.].
Машина начинает с определённого начального состояния и читает строку символов, состоящую из букв её алфавита. Автомат использует функцию переходов Δ, чтобы определить следующее состояние по текущему состоянию и только что прочитанному символу или пустой строке. Однако «следующее состояние НКА зависит не только от текущего входного символа, но и от произвольного числа последующих входных событий. Пока эти последующие события происходят, невозможно определить, в каком состоянии машина находится»[13]. Если автомат после последнего прочитанного символа находится в конечном состоянии, говорят, что НКА принимает строку, в противном случае говорят, что он строку отвергает.
Множество всех строк, принимаемых НКА, является языком, который принимает НКА. Этот язык является регулярным языком.
Для любого НКА можно найти детерминированный конечный автомат (ДКА), который принимает тот же самый язык. Поэтому есть возможность преобразовать существующий НКА в ДКА с целью реализации (возможно) более простой машины. Такое преобразование осуществляется с помощью конструкцией подмножеств[англ.], которое может вести к экспоненциальному увеличению числа необходимых состояний. Для формального доказательства конструкции подмножеств см. статью «Конструкция подмножеств[англ.]».
НКА можно моделировать одним из следующих способов:
НКА и ДКА эквивалентны в том смысле, что если язык распознаётся НКА автоматом, он распознаётся и ДКА. Верно и обратное. Установление такой эквивалентности важно и полезно. Важно, поскольку НКА могут использоваться для уменьшения сложности математической работы, которая нужна для установления важных свойств в теории алгоритмов. Например, много легче доказать замкнутость регулярных языков с помощью НКА, чем с помощью ДКА. Полезно, потому что построение НКА для распознавания этого языка иногда много важнее построения ДКА для этого языка.