Construcción de subconjuntos

En teoría de la computación, la Construcción de subconjuntos es un método estándar para, partiendo de un NFA (Autómata Finito No Determinista), obtener un DFA (Autómata Finito Determinista) equivalente, es decir, que reconozca el mismo Lenguaje regular. En la teoría es importante porque establece que los NFAs aunque son más flexibles, no pueden reconocer ningún lenguaje que un DFA no pueda. Sin embargo, dado un NFA con estados, el DFA equivalente podría tener hasta estados, por lo que a veces, construir un DFA a partir de un NFA de gran tamaño no es practicable. Este problema se minimiza en gran medida con el algoritmo de Construcción de subconjuntos, el cual limita la inserción de estados al DFA resultante únicamente a los casos estrictamente necesarios.

Sea un NFA. El algoritmo de Construcción de subconjuntos permite hallar un DFA de modo que

Algoritmo de construcción de subconjuntos

Veamos un Pseudocódigo para el algoritmo:

 = S = ;
desmarcar(S);
DFA_states := {S};
While ( T  DFA_states and !marcado(T)) do
   marcar (T);
   For all a  do
      R := (T, a));
      (T, a) := R;
      if (!(R  DFA_states)) then
         DFA_states := DFA_states  {R};
         desmarcar(R);
      end;
  end;
end;

Apliquemos ahora el algoritmo al NFA de la siguiente figura:

Empezamos obteniendo la -clausura del estado de arranque del NFA, es decir, el conjunto de estados alcanzables desde el estado inicial, consumiendo únicamente -transiciones.


Una vez que tenemos definido el estado de arranque de nuestro DFA, podemos empezar a completar los estados y transiciones restantes. Como sabemos que S representa un conjunto de estados del NFA inicial, sólo tenemos que hacer transitar dicho conjunto con cada símbolo de nuestro alfabeto y estudiar a que otros conjuntos se llega. Si estos otros conjuntos no pertenecen a Q', entonces los añadiremos a nuestro DFA, en el caso contrario, sólo tendremos que añadir nuevas transiciones.
En nuestro caso, nuestro estado inicial S = {0,1,2,4,7} transita con símbolo 'a' a un nuevo conjunto ({3,8}), al cual calcularemos su -clausura para obtener B = {0,1,2,3,4,6,7,8}.


Repetimos el proceso anterior usando ahora el otro símbolo perteneciente a nuestro alfabeto.



Una vez creadas todas las transiciones posibles para nuestro estado inicial (S), continuamos la ejecución del algoritmo con cada uno de los estados encontrados previamente. En esta iteración, obtenemos un conjunto de estados ya conocido, por lo cual, solo tendremos que añadir la transición correspondiente a nuestro autómata.

















El conjunto de estados de aceptación del DFA resultante estará formado por todos aquellos estados que contengan un estado final del NFA. En nuestro caso, el NFA inicial tenía un estado de aceptación identificado como 10. En el proceso que hemos seguido sólo hemos obtenido un conjunto que contenga éste estado (E), por lo cual este se convertirá en nuestro nuevo estado de aceptación.


El DFA resultante quedaría de esta forma:

Otro ejemplo

Otro ejemplo


Referencias

  • Kelley, Dean (1995). Teoría de Autómatas y Lenguajes Formales. Prentice Hall. ISBN 0-13-518705-2. 
  • Hopcroft, J., Motwani, R., y Ullman, J. (2002). Introducción a la teoría de Autómatas, Lenguajes y Computación. Addison Wesley. ISBN 84-7829-056-7. 

Enlaces externos