public Algoritmo( string path, string pred_obj)
        {
            predicados = new HashSet<Literal>();
            dominio = new HashSet<string>();
            baseConocimiento = new List<Literal>();
            conocimientoPos = new List<Literal>();
            conocimientoNeg = new List<Literal>();
            objetivo = pred_obj;
            var file = (from lines in File.ReadAllLines(@path)
                        let line = lines.Split(new[] { "(" }, StringSplitOptions.RemoveEmptyEntries)
                        select new
                        {
                            predicado = line[0],
                            atributos = line[1].Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
                        }
                        );
            foreach (var lit in file)
            {
                int natt = lit.atributos.Count();
                Literal nuevo = new Literal(lit.predicado, natt);
                predicados.Add(nuevo.Clone()); //para tener la cardinalidad tb
                string[] att = lit.atributos;
                att[natt - 1] = att[natt - 1].Remove(att[natt - 1].Count() - 1);
                nuevo.Atributos = att;

                dominio.UnionWith(att);

                if (lit.predicado == pred_obj)
                    conocimientoPos.Add(nuevo);
                else
                {
                    baseConocimiento.Add(nuevo);
                    //predicados.Add(lit.predicado); //Para recursivo poner fuera del else
                }
            }
            predicados.RemoveWhere(T => T.Nombre == objetivo);
            int n_att = conocimientoPos[0].nAtt;
            foreach (var litNeg in dominio.Repetitions(n_att))
            {
                Literal nuevo = new Literal(pred_obj, n_att);
                nuevo.Atributos = litNeg;
                conocimientoNeg.Add(nuevo);
            }
            conocimientoNeg.RemoveAll(T => conocimientoPos.Contains(T));
        }
 private List<Literal> generarCandidatos(HashSet<Literal> predicados, HashSet<string> usados)
 {
     List<Literal> candidatos = new List<Literal>();
     foreach(var predicado in predicados)
     {
         int natt_nuevo = Convert.ToInt32(usados.Max());
         HashSet<string> usados_cpy = new HashSet<string>(usados);
         for (int i = 0; i < predicado.nAtt-1; i++)
         {
             usados_cpy.Add("" + (i+natt_nuevo+1) );
         }
         // añadir natt_nuevo a usados
         foreach (var atributos in usados_cpy.Repetitions(predicado.nAtt))
         {
             candidatos.Add(new Literal(predicado.Nombre, predicado.nAtt, atributos));
         }
     }
     return candidatos;
 }