public static List <List <Assignment> > Distinct(List <List <Assignment> > solutions)
        {
            List <List <Assignment> > distinctSols = new List <List <Assignment> >();

            foreach (List <Assignment> sol in solutions)
            {
                if (!distinctSols.Any(s => BottomUpFOLEvaluator.CompareSolutions(s, sol)))
                {
                    distinctSols.Add(sol);
                }
            }
            return(distinctSols);
        }
        public static List <List <Assignment> > Search(string body, string query, bool topDownSearch)
        {
            List <string> subwords       = getAllSubwords(body);
            string        folExpression  = query.Substring(query.IndexOf(":=") + 2);
            string        freeVarsString = query.Substring(query.IndexOf('(') + 1).Substring(0, query.IndexOf(')') - 2);

            string[] freeVars = freeVarsString.Split(',');

            ParseTreeFOL_Q parsedExpression = FOLParser.Parse(folExpression, body);

            List <List <Assignment> > res;

            if (topDownSearch)
            {
                res = TopDownFOLEvaluator.evaluateParsedExpression(parsedExpression, subwords.ToArray(), freeVars, body);
            }
            else
            {
                res = BottomUpFOLEvaluator.EvaluateParsedExpression(parsedExpression, subwords.ToArray(), freeVars, body);
            }
            return(res);
        }