Ejemplo n.º 1
0
 public static InferenceKnowledgeBase Parse(string[] lines)
 {
     var kb = new InferenceKnowledgeBase();
     foreach (var line in lines)
     {
         var rule = new InferenceState();
         foreach (var lit in line.Split(' '))
         {
             var isNegated = lit.StartsWith("-");
             rule.Clause.Add(new Literal(isNegated ? lit.Substring(1) : lit, !isNegated));
         }
         kb.Rules.Add(rule);
     }
     return kb;
 }
Ejemplo n.º 2
0
        public void Run()
        {
            Console.WriteLine();
            Console.WriteLine("--- " + this.Name + " ---");
            var succeeded = 0;
            foreach (var test in this.Tests)
            {
                Console.Write("Test: " + test.Name);
                SearchResult result;
                if (this.IsInference)
                {
                    var kb = InferenceKnowledgeBase.ParseFile(test.File);

                    var parsedTarget = InferenceKnowledgeBase.ParseString(test.Target).Rules.First();
                    var targetState = new InferenceState(parsedTarget.Clause);

                    result = AStar.Search(new InferenceNode(targetState, new InferenceState()), kb);
                }
                else
                {
                    Console.Write(" ... Parsing");
                    var kb = RouteFindingKnowledgeBase.Parse(File.ReadAllText(test.File));

                    var coords = test.Target.Split(',');
                    var startCoord = coords[0].Split(' ');
                    var endCoord = coords[1].Split(' ');
                    var startState = new RouteFindingState(int.Parse(startCoord[0]), int.Parse(startCoord[1]));
                    var endState = new RouteFindingState(int.Parse(endCoord[0]), int.Parse(endCoord[1]));

                    Console.Write(" ... Solving");
                    result = AStar.Search(new RouteFindingNode(startState, endState), kb);
                }

                if (result.Succeeded == test.Exepected)
                    succeeded++;

                Console.Write(result.Succeeded == test.Exepected ? ": SUCCESS" : ": FAILURE");
                Console.WriteLine((result.Succeeded ? " (solved " : " (not solved ") + "in " + result.Iterations + (result.Iterations == 1 ? " iteration)" : " iterations)"));
            }
            var succesRatio = (100 * succeeded) / (double)this.Tests.Count;
            Console.WriteLine("Passed " + succeeded + " of " + this.Tests.Count + " (" + succesRatio.ToString("000") + "%)");
        }
Ejemplo n.º 3
0
        public InferenceNode ApplyResolution(InferenceNode parent, AbstractAction act)
        {
            var state = new InferenceState();
            var actionState = act.StartState as InferenceState;

            foreach (var firstLiteral in parent.State.Clause)
            {
                foreach (var secondLiteral in actionState.Clause)
                {
                    if (firstLiteral.Name.Equals(secondLiteral.Name) && firstLiteral.Proposition != secondLiteral.Proposition)
                    {
                        // Merger samtlige literals fra de to clauses
                        state.Clause = parent.State.Clause.Concat(actionState.Clause).ToList();

                        // Fjern en enkelt positiv og en enkelt negativ
                        state.Clause.Remove(state.Clause.First(lit => lit.Name.Equals(secondLiteral.Name) && lit.Proposition));
                        state.Clause.Remove(state.Clause.First(lit => lit.Name.Equals(secondLiteral.Name) && !lit.Proposition));

                        // Fjerne duplikater, f.eks. A & A & B -> A & B
                        state.Clause = state.Clause.Distinct().ToList();

                        return new InferenceNode(parent, parent.Target, state, new InferenceAction(state, parent.Target));
                    }
                }
            }

            //Fjerner resten af modsatte literals..
            return new InferenceNode(parent, parent.Target, state, new InferenceAction(state, parent.Target));
        }