Un autómata finito no determinista ( NFA ), o una máquina de estado finito no determinista , no necesita obedecer estas restricciones. En particular, cada DFA es también un NFA. A veces, el término NFA se usa en un sentido más estricto, en referencia a un NFA que no es un DFA, pero no en este artículo.
Usando el algoritmo de construcción de subconjuntos , cada NFA se puede traducir a un DFA equivalente; es decir, un DFA que reconoce el mismo lenguaje formal . [1] Al igual que los DFA, los NFA solo reconocen lenguajes regulares .
Los NFA fueron introducidos en 1959 por Michael O. Rabin y Dana Scott , [2] quienes también demostraron su equivalencia con los DFA. Los NFA se utilizan en la implementación de expresiones regulares : la construcción de Thompson es un algoritmo para compilar una expresión regular en un NFA que puede realizar de manera eficiente la coincidencia de patrones en cadenas. Por el contrario, el algoritmo de Kleene se puede utilizar para convertir un NFA en una expresión regular (cuyo tamaño es generalmente exponencial en el autómata de entrada).
Los NFA se han generalizado de múltiples maneras, por ejemplo, autómatas finitos no deterministas con movimientos ε , transductores de estado finito , autómatas pushdown , autómatas alternos, autómatas ω y autómatas probabilísticos . Además de los DFA, otros casos especiales conocidos de NFA son los autómatas finitos inequívocos (UFA) y los autómatas finitos autoverificadores (SVFA).
Un NFA está representado formalmente por una tupla de 5 , , que consta de
Aquí, denota el conjunto potencia de .