Un aspecto sorprendente de los AFND es que son equivalentes a los AF; esto quiere decir que todo AFND podrá ser reducido a un AF.
Reducción #
La reducción recae en el hecho que todo AFND tiene un número finito de estados, y podemos imaginarnos que una combinación de estados de un AFND sera equivalente a un estado de un AF. De esta forma cuando en un AFND estamos en una combinación de estados y llega un símbolo, y este nos lleva a otra combinación, en realidad nos estamos moviendo de un estado a otro en el AF a través del mismo símbolo.
Por supuesto, existe un problema exponencial ya que los posibles estados en AF dado un AFND son todas las posibles combinaciones de los estados de este. Tratar de hacer el análisis de dicho número de combinaciones no es práctico. Sin embargo, existe un proceso más directo que no requiere explorar todo este espacio y es a través de codificar los estados del AF con un código posicional de los estados del AFND. Un 1 en el código del AF representa que el estado en el AFND está activo, si hay más unos en el código todos estos estados se encuentran activos, mientas que un 0 representa que el estado correspondiente en el AFND no está activo.
El procedimiento #
Suponiendo un AFND \((Q,\Sigma,q_0,A,\delta)\) el siguiente procedimiento genera la tabla de transición de un AF \((Q',\Sigma,q'_0,A',\delta')\) equivalente:
- Definir el código para los estados nuestro AF, cada estado \(q\in Q\) define una posición de esa codificación.
- Agregamos en nuestra tabla una fila para donde estado origen es \(q_0\) cuyo código es la posición del estado inicial activada con un 1 mientras que el restos de las posiciones son cero.
- Por cada símbolo \(a \in \Sigma \) construir la codificación en la columna correspondiente al símbolo a dónde se activan los estados a los que se llega con dicho símbolo partiendo del estado origen correspondiente a la fila.
- Por cada codificación nueva que aparezca en las columnas agregar una fila.
- Si existe un código que no haya sido analizada regresar a 3.
Al final podemos renombrar las codificaciones de los estados con nombres más compactos.
Finalmente, Q será conformado por todos los estados identificados, \(q'_0\) será el estado correspondiente a la codificación creada en el paso 2; A estará conformada por todos los estados cuya codificación tiene activa una posición correspondiente a un estado final del original AFND; y finalmente la tabla de transición representa \(q'_0\) .
Ejemplo #
Supongamos el siguiente orden para nuestros estados del AFND:
\[ q_{0}, q_{11/1}, q_{11/5}, q_{11/3}, q_{11/4}, q_{11/2}, q_{12/7}, q_{12/8}, q_{12/6}, q_{5}, q_{21/1}, q_{31/1}, \\ q_{41/1}, q_{11_12/2}, q_{11_12/3}, q_{21_12/3}, q_{21/4}, q_{21_12/4}, q_{21/5}, q_{31/5}, q_{22/6}, q_{11_12/7},\\ q_{11_12/8}, q_{21_12/8}\]Con este orden podemos codificar el estado inicial como:
\[100000000000000000000000 \]Con este estado inicial podemos averiguar a dónde llegamos si recibimos cada uno de los símbolos del alfabeto:
Estado | 1 | 2 | 5 |
---|---|---|---|
100000000000000000000000 | 011111000000000000000000 | 000000111000000000000000 | 000000000100000000000000 |
En este caso las tres codificaciones resultantes son nuevas, por lo que hay que agregarlas y calcular a dónde podemos llegar si llega uno de los símbolos del alfabeto:
Estado | 1 | 2 | 5 |
---|---|---|---|
100000000000000000000000 | 011111000000000000000000 | 000000111000000000000000 | 000000000100000000000000 |
011111000000000000000000 | |||
000000111000000000000000 | |||
000000000100000000000000 |
Si hacemos el calculo para estas nuevas filas obtenemos:
estado | 1 | 2 | 5 |
---|---|---|---|
100000000000000000000000 | 011111000000000000000000 | 000000111000000000000000 | 000000000100000000000000 |
011111000000000000000000 | 000000000010000010100000 | 000000000000011000000000 | 000000000000000000000000 |
000000111000000000000000 | 000000000000000000000110 | 000000000000000000001000 | 000000000000000000000000 |
000000000100000000000000 | 000000000000000000000000 | 000000000000000000000000 | 000000000000000000000000 |
Es importante notar que la codificación con sólo ceros, representa que con ese símbolos y el estado en el que se encuentra no se puede llegar ningún estado, es un estado de error.
La tabla final resultante es:
estado | 1 | 2 | 5 |
---|---|---|---|
100000000000000000000000 | 011111000000000000000000 | 000000111000000000000000 | 000000000100000000000000 |
011111000000000000000000 | 000000000010000010100000 | 000000000000011000000000 | 000000000000000000000000 |
000000111000000000000000 | 000000000000000000000110 | 000000000000000000001000 | 000000000000000000000000 |
000000000100000000000000 | 000000000000000000000000 | 000000000000000000000000 | 000000000000000000000000 |
000000000010000010100000 | 000000000001000000010000 | 000000000000000001000000 | 000000000000000000000000 |
000000000001000000010000 | 000000000000100000000000 | 000000000100000000000000 | 000000000000000000000000 |
000000000000100000000000 | 000000000100000000000000 | 000000000000000000000000 | 000000000000000000000000 |
000000000000011000000000 | 000000000000000100000000 | 000000000100000000000000 | 000000000000000000000000 |
000000000000000100000000 | 000000000100000000000000 | 000000000000000000000000 | 000000000000000000000000 |
000000000000000001000000 | 000000000100000000000000 | 000000000000000000000000 | 000000000000000000000000 |
000000000000000000001000 | 000000000100000000000000 | 000000000000000000000000 | 000000000000000000000000 |
000000000000000000000110 | 000000000000000000000001 | 000000000100000000000000 | 000000000000000000000000 |
000000000000000000000001 | 000000000100000000000000 | 000000000000000000000000 | 000000000000000000000000 |
Por supuesto la tabla es incomprensible, pero podemos renombrar los estados de la siguiente forma:
estado | nuevo nombre |
---|---|
100000000000000000000000 | q_0 |
011111000000000000000000 | q_1 |
000000111000000000000000 | q_2 |
000000000100000000000000 | q_3 |
000000000010000010100000 | q_4 |
000000000001000000010000 | q_5 |
000000000000100000000000 | q_6 |
000000000000011000000000 | q_7 |
000000000000000100000000 | q_8 |
000000000000000001000000 | q_9 |
000000000000000000001000 | q_10 |
000000000000000000000110 | q_11 |
000000000000000000000001 | q_12 |
Resultando:
estado | 1 | 2 | 5 |
---|---|---|---|
⟶ q_0 | q_1 | q_2 | q_3 |
q_1 | q_4 | q_5 | |
q_2 | q_6 | q_7 | |
q_3 | |||
q_4 | q_8 | q_9 | |
q_5 | q_10 | q_3 | |
q_6 | q_11 | q_3 | |
q_7 | q_3 | ||
q_8 | q_12 | q_3 | |
q_9 | q_3 | ||
q_10 | q_3 | ||
q_11 | q_3 | ||
q_12 | q_3 |
Finalmente, si lo graficamos queda de la siguiente forma: