コード例 #1
0
        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);
            }
        }