# Autómata finito no determinista

Un autómata finito no determinista (abreviado AFND) es un autómata finito que, a diferencia de los autómatas finitos deterministas (AFD), posee al menos un estado q ∈ Q, tal que para un símbolo a ∈ Σ del alfabeto, existe más de una transición δ(q,a) posible. Todo AFND puede ser convertido en un AFD equivalente.
En un AFND puede darse cualquiera de estos dos casos:
* Que existan transiciones del tipo δ(q,a)=q$_1$ y δ(q,a)=q$_2$, siendo q$_1$ ≠ q$_2$;
* Que existan transiciones del tipo δ(q, ε), siendo q un estado no-final, o bien un estado final pero con transiciones hacia otros estados.
Cuando se cumple el segundo caso, se dice que el autómata es un autómata finito no determinista con transiciones vacías o transiciones ε (abreviado AFND-ε). Estas transiciones permiten al autómata cambiar de estado sin procesar ningún símbolo de entrada. Considérese una modificación al modelo del autómata finito para permitirle ninguna, una o más transiciones de un estado sobre el mismo símbolo de entrada.

## Definición formal

Formalmente, si bien un autómata finito determinista se define como una 5-tupla (Q, Σ, q$_0$, δ, F) donde:
* $Q\,$ es un conjunto de estados;
* $\Sigma \,$ es un alfabeto;
* $q_{0}\in Q$ es el estado inicial;
* $\delta \colon Q\times \Sigma \to Q$ es una función de transición;
* $F\subseteq Q$ es un conjunto de estados finales o de aceptación.
en un AFND la función de transición se define como:
    $\delta :Q\times \Sigma \to {\mathcal {P}}(Q)$
Para el caso de los AFND-ε, se suele expresar la función de transición de la forma:
    $\delta :Q\times \{\Sigma \cup \epsilon \}\to {\mathcal {P}}(Q)$
donde P(Q) es el conjunto potencia de Q. Esto significa que los autómatas finitos deterministas son un caso particular de los no deterministas, puesto que Q pertenece al conjunto P(Q).
La interpretación que se suele hacer en el cómputo de un AFND es que el automáta puede pasar por varios estados a la vez, generándose una ramificación de las configuraciones existentes en un momento dado. Asimismo, en un autómata finito no determinista podemos aceptar la existencia de más de un nodo inicial.

## Funcionamiento

La máquina comienza en el estado inicial especificado y lee una cadena de caracteres pertenecientes al alfabeto. El autómata utiliza la función de transición de estados T para determinar el siguiente estado, usando el estado actual y el símbolo que acaba de leer o la cadena vacía. Sin embargo, "el estado siguiente de un AFND no solo depende de el evento de entrada actual, sino que también en un número arbitrario de los eventos de entrada posterior. Hasta que se producen estos acontecimientos posteriores no es posible determinar en qué estado se encuentra la máquina" . Cuando el autómata ha terminado de leer, y se encuentra en un estado de aceptación, se dice que el AFND acepta la cadena, de lo contrario se dice que la cadena de caracteres es rechazada. Tanto para un AFND como para un autómata finito determinista (AFD) se puede aceptar el mismo lenguaje. Por lo tanto, es posible convertir un AFND existente en un AFD para el desarrollo de una máquina tal vez más simple. Esto puede llevarse a cabo utilizando la construcción del conjunto potencia, que puede conducir a un aumento exponencial en el número de estados necesarios.

## Implementación

Hay muchas formas de implementar una AFND:
* Convertir al equivalente AFD: en algunos casos esto puede causar un aumento exponencial en el tamaño del autómata, y así un espacio auxiliar proporcional al número de estados en el AFND (como el almacenamiento del valor del estado requiere en la mayoría de un bit por cada estado en el AFND).
* Mantener un conjunto de datos de todos los estados en que la máquina podría estar en la actualidad. Al consumir el último carácter de entrada, si uno de estos estados es un estado final, la máquina acepta la cadena. En el peor de los casos, esto puede requerir espacio adicional proporcional al número de estados en el AFND; si la estructura del conjunto usa un bit por estado del AFND, entonces esta solución es exactamente equivalente a la anterior.
* Crear múltiples copias. Por cada n forma de la decisión, el AFND crea hasta n-1 copias de la máquina. Cada uno de ellos entrara en un estado independiente. Si, al momento de consumir el último símbolo de la entrada, al menos una copia del AFND esta en un estado de aceptación, el AFND lo aceptará. (Esto también requiere un almacenamiento lineal con respecto al número de estados del AFND, ya que puede haber una máquina por cada estado del AFND).

## AFND-ε
### Propiedades

Para todo $p,q\in Q,$, se escribe $p{\stackrel {\epsilon }{\rightarrow }}q$ si y solo si a $q$ se puede llegar desde $p$, yendo a lo largo de cero o más flechas $\epsilon$. En otras palabras, $p{\stackrel {\epsilon }{\rightarrow }}q$ si y solo si existe $q_{1},q_{2},\cdots q_{k}\in Q$ donde $k\geq 0$ tal que
    $q_{1}\in T(p,\epsilon ),q_{2}\in T(q_{1},\epsilon ),\cdots q_{k}\in T(q_{k-1},\epsilon ),q\in T(q_{k},\epsilon )$.
Para cualquier $p\in Q$, el conjunto de estados a los que se puede llegar a partir de p se le llama epsilon-closure o ε-closure de p y se escribe como
    $\,E(\{p\})=\{q\in Q:p{\stackrel {\epsilon }{\rightarrow }}q\}$.
Para cualquier subconjunto $P\subseteq Q$, definir el ε-closure de P como
    $E(P)=\bigcup \limits _{p\in P}E(\{p\})$.
Para el conjunto vacío
    $E(\{\})=\{\}$.
Para cualquier subconjunto $A\subseteq Q$ y $B\subseteq Q$ se cumplen las propiedades:
    $E(E(A))=E(A)$.
    Si $A\subseteq B$ entonces $E(A)=E(B)$.
    $E(A\cup B)=E(A)\cup E(B)$.
Las transiciones epsilon son transitivas, ya que puede demostrarse que para todo $q_{0},q_{1},q_{2}\in Q$ y $P\subset Q$, si $q_{1}\in E(\{q_{0}\})$ y $q_{2}\in E(\{q_{1}\})$, entonces $q_{2}\in E(\{q_{0}\})$.
Del mismo modo, si $q_{1}\in E(P)$ y $q_{2}\in E(\{q_{1}\})$ entonces $q_{2}\in E(P)$ Sea x una cadena del alfabeto Σ∪{ε}. Un AFND-ε M acepta la cadena x si existe tanto una representación de x de la forma x$_1$x$_2$ ... x$_n$, donde x$_i$ ∈ (Σ ∪{ε}), y una secuencia de estados
p$_0$,p$_1$, ..., p$_n$, donde p$_i$ ∈ Q, Cumpliéndose las siguientes condiciones:
* p$_0$ $\in$ E({q$_0$})
* p$_i$ $\in$ E(T(p$_{i-1}$, x$_i$ )) para i = 1, ..., n
* p$_n$ $\in$ F.
Sea $P\subseteq Q$, la definición recursiva de $E(P)$ es:
* $\forall q\in P\Rightarrow q\in E(P)$
* $\forall q\in E(P)\land \forall p\in T(q,\epsilon )\Rightarrow p\in E(P)$
Para calcular $E(P)$ :
definiremos $E(P)=B_{n}$ donde
* $B_{0}=P$
* $B_{i}=B_{i-1}\cup \{p/q\in B_{i-1}\land p\in T(q,\epsilon )\}$
Si $B_{i}=B_{i-1}\Rightarrow B_{n}=B_{i-1}$

### Aplicación

El AFND y el AFD son equivalentes en esto, ya que si un lenguaje es reconocido por el AFND, también será reconocido por un AFD, y viceversa. El establecimiento de esta equivalencia es útil porque a veces la construcción de un AFND para reconocer un lenguaje determinado es más fácil que construir un AFD para dicho lenguaje. También es importante porque el AFND se puede utilizar para reducir la complejidad del trabajo matemático necesario para establecer muchas propiedades importantes en la teoría de la computación. Por ejemplo, es mucho más fácil demostrar las siguientes propiedades utilizando un AFND que un AFD:
* La unión de dos lenguajes regulares es regular.
* La concatenación de dos lenguajes regulares es regular.
* La Clausura de Kleene en un Lenguaje regular es regular.

## Ejemplo

El ejemplo siguiente muestra un AFND M, con un alfabeto binario que determina si la entrada contiene un número par de ceros (0) o un número par de unos (1). Entonces M = (Q, Σ, T, s$_0$, F) donde:
* Σ = {0, 1},
* Q = {s$_0$, s$_1$, s$_2$, s$_3$, s$_4$},
* E({s$_0$}) = { s$_0$, s$_1$, s$_3$ }
* F = {s$_1$, s$_3$}, y
* La función de transición T puede ser definida por esta tabla de transición de estados:
| | 0 | 1 | ε |
| S$_0$ | | | {S$_1$, S$_3$} |
| S$_1$ | {S$_2$} | {S$_1$} | |
| S$_2$ | {S$_1$} | {S$_2$} | |
| S$_3$ | {S$_3$} | {S$_4$} | |
| S$_4$ | {S$_4$} | {S$_3$} | |
El diagrama de estados para M es:
M puede ser visto como la unión de dos AFDs: uno con los estados {S$_1$, S$_2$} y el otro con los estados {S$_3$, S$_4$}.
El lenguaje de M puede ser descrito por el lenguaje regular dado por la expresión regular:
    $(1^{*}(01^{*}01^{*})^{*})\cup (0^{*}(10^{*}10^{*})^{*})$