public void KnowledgeBaseShouldMatchFacts() { var kb = new InMemoryKnowledgeBase(); kb.AssertLast(ErgolParser.Parse("fact.", ErgolParser.TryParseClause)); kb.AssertLast(ErgolParser.Parse("not_a_fact :--> false.", ErgolParser.TryParseClause)); var res = kb.Solve(ErgolParser.Parse("fact.", ErgolParser.TryParseQuery)); Assert.Single(res.Root.Children); res = kb.Solve(ErgolParser.Parse("not_a_fact.", ErgolParser.TryParseQuery)); Assert.Empty(res.Root.Children); }
static void Main(string[] args) { var kb = new InMemoryKnowledgeBase(); kb.AssertLast(ErgolParser.Parse("loves(john, jane).", ErgolParser.TryParseClause)); kb.AssertLast(ErgolParser.Parse("loves(jack, jane).", ErgolParser.TryParseClause)); kb.AssertLast(ErgolParser.Parse("jealous(A, B) :-\n\tloves(A, C),\n\tloves(B, C).", ErgolParser.TryParseClause)); Console.Write("?- "); while (Console.ReadLine() is { } line&& line != "q") { try { if (line.StartsWith(":") && ErgolParser.TryParseClause(line[1..]).TryGetValue(out var clause))
public void KnowledgeBaseShouldSolveJealousXY() { var kb = new InMemoryKnowledgeBase(); kb.AssertLast(ErgolParser.Parse("loves(marcellus, mia).", ErgolParser.TryParseClause)); kb.AssertLast(ErgolParser.Parse("loves(vincent, mia).", ErgolParser.TryParseClause)); kb.AssertLast(ErgolParser.Parse("jealous(A, B) :-\n\tloves(A, C),\n\tloves(B, C).", ErgolParser.TryParseClause)); var res = kb.Solve(ErgolParser.Parse("jealous(X, Y).", ErgolParser.TryParseQuery)); var sol = res.Solutions().ToList(); Assert.Equal(4, sol.Count); Assert.Equal("X = marcellus, Y = marcellus", sol[0].Canonical()); Assert.Equal("X = marcellus, Y = vincent", sol[1].Canonical()); Assert.Equal("X = vincent, Y = marcellus", sol[2].Canonical()); Assert.Equal("X = vincent, Y = vincent", sol[3].Canonical()); }
public void VariablesShouldUnifyThroughAssignment() { var kb = new InMemoryKnowledgeBase(); kb.AssertLast(ErgolParser.Parse("fact(a, b).", ErgolParser.TryParseClause)); var res = kb.Solve(ErgolParser.Parse("fact(A, B).", ErgolParser.TryParseQuery)); var sol = res.Solutions().ToList(); Assert.Single(sol); res = kb.Solve(ErgolParser.Parse("fact(A, A).", ErgolParser.TryParseQuery)); Assert.Null(res.Root); kb.AssertLast(ErgolParser.Parse("fact(one, one, two).", ErgolParser.TryParseClause)); res = kb.Solve(ErgolParser.Parse("fact(A, A, B).", ErgolParser.TryParseQuery)); sol = res.Solutions().ToList(); Assert.Single(sol); }