public static void Resolve(RuleData rules) { Console.WriteLine("Input clauses: "); rules.Print(); Console.WriteLine("\nQuery:\n " + rules.Goal.Stringify() + "?\n"); var negatedGoal = new Atom(rules.Goal); negatedGoal.Truthfulness = !negatedGoal.Truthfulness; var negatedGoalTerm = new Term(negatedGoal) { FromGoal = 0 }; var newRules = new RuleData(); newRules.Terms.Add(negatedGoalTerm); rules.Terms.Add(negatedGoalTerm); negatedGoalTerm.Id = rules.Terms.Count; var initialRulesLength = rules.Terms.Count; var newTerms = GetInitialNewTerms(rules); while (true) { if (newTerms.Count == 0) { Console.WriteLine("Result: FALSE. No solution."); break; } newTerms.Sort(termComparer); var topTerm = newTerms[0]; newTerms.Remove(topTerm); newRules.Terms.Add(topTerm); rules.Terms.Add(topTerm); topTerm.Id = rules.Terms.Count; if (topTerm.Atoms[0].IsBool && !topTerm.Atoms[0].Truthfulness) { Console.WriteLine("Result: TRUE.\n\nProof clauses added:"); newRules = newRules.Prune(initialRulesLength); newRules.Print(); break; } var newestTerms = GetNewTerms(topTerm, rules, newTerms); newTerms.AddRange(newestTerms); } }