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; }
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") + "%)"); }
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)); }