public Automata uninion(Automata afn1, Automata afn2)
        {
            Automata afn_union   = new Automata();
            Estado   nuevoinicio = new Estado(0);

            nuevoinicio.setTransiciones(new Transicion(nuevoinicio, afn2.getEstadoInicial(), Form1.EPSILON));
            afn_union.addEstados(nuevoinicio);
            afn_union.setEstadoInicial(nuevoinicio);
            int i = 0;

            for (i = 0; i < afn1.getEstados().Count; i++)
            {
                Estado tmp = (Estado)afn1.getEstados()[i];
                tmp.setId(i + 1);
                afn_union.addEstados(tmp);
            }
            for (int j = 0; j < afn2.getEstados().Count; j++)
            {
                Estado tmp = (Estado)afn2.getEstados()[j];
                tmp.setId(i + 1);
                afn_union.addEstados(tmp);
                i++;
            }

            Estado nuevoFin = new Estado(afn1.getEstados().Count + afn2.getEstados().Count + 1);

            afn_union.addEstados(nuevoFin);
            afn_union.addEstadosAceptacion(nuevoFin);

            Estado    anteriorInicio = afn1.getEstadoInicial();
            ArrayList anteriorFin    = afn1.getEstadosAceptacion();
            ArrayList anteriorFin2   = afn2.getEstadosAceptacion();

            nuevoinicio.getTransiciones().Add(new Transicion(nuevoinicio, anteriorInicio, Form1.EPSILON));
            //Console.Write(anteriorFin[0]);
            for (int k = 0; k < anteriorFin.Count; k++)
            {
                Estado aux = (Estado)anteriorFin[k];
                aux.getTransiciones().Add(new Transicion((Estado)anteriorFin[k], nuevoFin, Form1.EPSILON));
            }

            for (int k = 0; k < anteriorFin.Count; k++)
            {
                Estado aux = (Estado)anteriorFin2[k];
                aux.getTransiciones().Add(new Transicion((Estado)anteriorFin2[k], nuevoFin, Form1.EPSILON));
            }

            HashSet <string> alfabeto = new HashSet <string>(afn1.getAlfabeto());

            alfabeto.UnionWith(afn2.getAlfabeto());
            afn_union.setAlfabeto(alfabeto);
            afn_union.setLenguajeR(afn1.getLenguajeR() + " " + afn2.getLenguajeR());
            return(afn_union);
        }
        public Automata cerraduraKleen(Automata afn)
        {
            Automata afnkleen    = new Automata();
            Estado   nuevoinicio = new Estado(0);

            afnkleen.addEstados(nuevoinicio);
            afnkleen.setEstadoInicial(nuevoinicio);

            int q = 1;

            foreach (Estado item in afn.getEstados())
            {
                Estado temp = item;
                temp.setId(q);
                q++;
                afnkleen.addEstados(temp);
            }

            Estado nuevoFin = new Estado(afn.getEstados().Count + 1);

            afnkleen.addEstados(nuevoFin);
            afnkleen.addEstadosAceptacion(nuevoFin);

            Estado    anteriorInicio = afn.getEstadoInicial();
            ArrayList anteriorFin    = afn.getEstadosAceptacion();


            nuevoinicio.getTransiciones().Add(new Transicion(nuevoinicio, anteriorInicio, Form1.EPSILON));
            nuevoinicio.getTransiciones().Add(new Transicion(nuevoinicio, nuevoFin, Form1.EPSILON));

            foreach (Estado estado in anteriorFin)
            {
                estado.getTransiciones().Add(new Transicion(estado, anteriorInicio, Form1.EPSILON));
                estado.getTransiciones().Add(new Transicion(estado, nuevoFin, Form1.EPSILON));
            }
            afnkleen.setAlfabeto(afn.getAlfabeto());
            afnkleen.setLenguajeR(afn.getLenguajeR());
            return(afnkleen);
        }
        public HashSet <Estado> metodoCerradura(Estado state)
        {
            Stack <Estado> pila   = new Stack <Estado>();
            Estado         actual = state;

            actual.getTransiciones();
            HashSet <Estado> rusultado = new HashSet <Estado>();

            pila.Push(actual);
            bool agrega;

            while (pila.Count != 0)
            {
                actual = pila.Pop();
                foreach (Transicion item in actual.getTransiciones())
                {
                    agrega = true;
                    if (item.getSimbolo().Equals(Form1.EPSILON))
                    {
                        foreach (Estado est in rusultado)
                        {
                            if (est.id.Equals(item.getFin().id))
                            {
                                agrega = false;
                            }
                        }
                        if (agrega == true)
                        {
                            rusultado.Add(item.getFin());
                            pila.Push(item.getFin());
                        }
                    }
                }
            }
            rusultado.Add(state);
            return(rusultado);
        }
        public Estado mover(Estado estado, string simbolo)
        {
            ArrayList alcanzados = new ArrayList();

            foreach (Transicion transicion in (ArrayList)estado.getTransiciones())
            {
                Estado estadosiguiente = transicion.getFin();
                string lexema          = transicion.getSimbolo();
                if (lexema.Equals(simbolo) && !alcanzados.Contains(estadosiguiente))
                {
                    alcanzados.Add(estadosiguiente);
                }
            }
            return((Estado)alcanzados[0]);
        }