private void crearConjuntos()
        {
            int cantidadOriginales = mapaAtributos.Count;
            List<KString> unitarios = new List<KString>();
            /*TODOS*/
            String nuevo = "";
            foreach (var key in mapaAtributos.Keys) {
                Atributo attr = mapaAtributos[key];
                if (!attr.esConjunto() && !attr.esMultivaluado()) {
                    nuevo += (nuevo == "") ? attr.getValor().value() : "," + attr.getValor();
                    unitarios.Add(attr.getValor());
                }
            }

            Atributo atributoConj = new Atributo(nuevo);
            if (!mapaAtributos.ContainsKey(atributoConj.getValor())) {
                mapaAtributos.Add(atributoConj.getValor(), atributoConj);
                System.Diagnostics.Debug.WriteLine("Agregado: " + nuevo);
            }

            /*Subconjuntos pequeños*/

            KString TODOS = new KString(nuevo);
            for (int i = 2; i < cantidadOriginales - 1; i++) {
                List<KString> nuevos = combinacion(unitarios, i);
                foreach (KString nuevoCon in nuevos) {
                    if (!mapaAtributos.ContainsKey(nuevoCon)) {
                        mapaAtributos.Add(nuevoCon, new Atributo(nuevoCon));
                    }
                }
            }
            /*
            List<String> nuevos = new List<String>();
            foreach (var atributoAQuitar in mapaAtributos.Keys) {
                nuevo = "";
                foreach (var key in mapaAtributos.Keys) {
                    if (atributoAQuitar == key) continue;
                    Atributo attr = mapaAtributos[key];
                    if (!attr.esConjunto() && !attr.esMultivaluado()) {
                        nuevo += (nuevo == "") ? attr.getValor().value() : "," + attr.getValor();
                    }
                }
                nuevos.Add(nuevo);
            }

            foreach (String val in nuevos) {
                Atributo atributoSubConj = new Atributo(val);
                if (!mapaAtributos.ContainsKey(atributoSubConj.getValor())) {
                    mapaAtributos.Add(atributoSubConj.getValor(), atributoSubConj);
                    System.Diagnostics.Debug.WriteLine("Agregado: " + val);
                }
            }*/
        }
        private void determinarClavePrimaria()
        {
            if (clavesCandidatas.Count <= 0) {
                MessageBox.Show("No se han encontrado Claves Candidatas ni clave primaria!\nNo se puede normalizar!");
                return;
            }
            cb_accion.Enabled = true;
            cb_accion.SelectedIndex = 1;

            int menor = clavesCandidatas.First().Value.getPeso();
            KString kmenor = clavesCandidatas.First().Key;
            if (menor > 1) {
                foreach(var key in clavesCandidatas.Keys){
                    Atributo kcand = clavesCandidatas[key];
                    if (kcand.getPeso() < menor) {
                        menor = kcand.getPeso();
                        kmenor = (KString)key;
                    }
                }
            }
            clavePrimaria = clavesCandidatas[kmenor];
            fmas.Text += "Clave Primaria: " + clavePrimaria.getValor() + " \n";
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            String entrada = tf_entrada.Text.ToUpper();
            switch (cb_tipo.SelectedIndex) {
                //Agregar Relacion
                case 0: {
                    if (relacionValida(entrada)) {
                        listaRelaciones.Items.Add(entrada);
                        String[] elementos = entrada.Split(',');
                        confPB(elementos.Length);
                        foreach (String elem in elementos) {
                            Atributo attr = new Atributo(elem);
                            mapaAtributos.Add(attr.getValor(), attr);
                            barra_progreso.PerformStep();
                        }
                        crearConjuntos();
                        barra_progreso.Value = 0;
                        cb_tipo.SelectedIndex = 1;
                        tf_entrada.Text = "";
                        etiqueta_estado.Text = "Esperando Dependencia...";
                    } else {
                        MessageBox.Show("Datos invalidos, porfavor revise: "+entrada+"\nFormato válido: X,Y<m>,Z,W<m>");
                    }
                        break;
                    }
                //Agregar Dependencia
                case 1: {
                        if (dependenciaValida(entrada)) {
                            String[] deps = entrada.Split('/');
                            foreach (String entradaD in deps) {
                                listaDependencias.Items.Add(entradaD);
                                String[] partes = entradaD.Split('>');
                                KString determinantes = new KString(partes[0]);
                                KString dependientes = new KString(partes[1]);

                                Atributo attrDeterminate;
                                Atributo attrDependiente;
                                if (mapaAtributos.ContainsKey(determinantes)) {
                                    attrDeterminate = mapaAtributos[determinantes];
                                } else {
                                    attrDeterminate = new Atributo(determinantes);
                                    mapaAtributos.Add(determinantes, attrDeterminate);
                                }
                                if (mapaAtributos.ContainsKey(dependientes)) {
                                    attrDependiente = mapaAtributos[dependientes];
                                } else {
                                    attrDependiente = new Atributo(dependientes);
                                    mapaAtributos.Add(dependientes, attrDependiente);
                                }
                                /*al agregar un determinante a un atributo internamente
                                 se agrega al atributo como dependiente.
                                 */
                                attrDependiente.addDeterminante(attrDeterminate);
                            }
                            tf_entrada.Text = "";
                            etiqueta_estado.Text = "Listo";
                            btn_ejecutar.Enabled = true;
                        } else {
                            MessageBox.Show("Datos invalidos, porfavor revise: " + entrada + "\nFormato válido: X,Y>W,Z[/Q,P>R,S]");
                        }
                        break;
                    }
            }//FIn Switch
        }