public object Clone()
        {
            Automaton           clon         = new Automaton();
            LinkedList <Estado> estados_clon = new LinkedList <Estado>();
            LinkedList <Estado> end_clon     = new LinkedList <Estado>();

            foreach (Estado e in this.getEstados())
            {
                Estado cln = (Estado)e.Clone();
                estados_clon.AddLast(cln);
            }



            foreach (Estado e2 in this.end)
            {
                Estado cln2 = (Estado)e2.Clone();
                end_clon.AddLast(cln2);
            }

            clon.begin   = (Estado)begin.Clone();
            clon.estados = estados_clon;
            clon.end     = end_clon;
            clon.type    = type;
            return(clon);
        }
        public Automaton cerradura_positiva(Automaton afn_pos)
        {
            Automaton afn = new Automaton();


            int i = 0;

            //Recorrer el automata actual
            for (i = 0; i < afn_pos.getEstados().Count(); i++)
            {
                //Clonar cada estado (sin sus transiciones)
                Estado aux          = afn_pos.getEstados().ElementAt(i);
                Estado nuevo_estado = (Estado)aux.Clone();

                if (i == 0)
                {
                    afn.setBegin(nuevo_estado);
                }
                afn.addEstados(nuevo_estado);
            }


            //Recorrer el nuevo automata
            for (int j = 0; j < afn.getEstados().Count(); j++)
            {
                //Estado auxiliar del automata nuevo
                Estado e = afn.getEstados().ElementAt(j);

                //Estado auxiliar del automata actual
                Estado e2 = afn_pos.getEstados().ElementAt(j);
                foreach (Transition t in e2.getTransitions())
                {
                    //Agregar las transiciones del nuevo automata
                    Transition aux = new Transition(search(afn.getEstados(), e2.getId()), search(afn.getEstados(), t.getEnd().getId()), t.getSimbol());
                    e.setTransitions(aux);
                }
            }

            for (int j = 0; j < afn_pos.getEstadosAceptacion().Count(); j++)
            {
                Estado aux = afn_pos.getEstadosAceptacion().ElementAt(j);
                Estado n   = search(afn.getEstados(), aux.getId());
                afn.addEstadosAceptacion(n);
            }

            return(afn);
        }