public static bool PlResolution(Sentence premises, Sentence conclusion) { List<Clause> clauses = premises.Clauses.Union(conclusion.GetNegation().Clauses).ToList(); List<Clause> newc = new List<Clause>(); while (true) { foreach (Clause ci in clauses) { List<Clause> restClauses = new List<Clause>(clauses); restClauses.Remove(ci); foreach (Clause cj in restClauses) { List<Clause> resolvents = PlResolve(ci, cj); if (resolvents.All(x => x.IsEmpty())) { return true; } newc.U(resolvents); } } if (newc.IsSubsetOf(clauses)) return false; clauses.U(newc); } }
public void SentenceNegationTest() { Clause a = new Clause(); a.AddLiteral(new Literal("~", "A")); a.AddLiteral(new Literal("", "B")); a.AddLiteral(new Literal("~", "C")); Clause b = new Clause(); b.AddLiteral(new Literal("", "C")); b.AddLiteral(new Literal("", "D")); b.AddLiteral(new Literal("", "E")); Sentence s = new Sentence(); s.AddClause(a); s.AddClause(b); /* s is now ( ~A v B v ~C ) ^ ( C v D v E ) NEGATE IT ~ ( ( ~A v B v ~C ) ^ ( C v D v E ) ) DeMorgan's gives us ~ ( ~A v B v ~C ) v ~ ( C v D v E ) DeMorgan's again ( A ^ ~B ^ C ) v (~C ^ ~D ^ ~E ) Expected result is thus: ( A v ~C ) ^ ( A v ~D ) ^ ( A v ~E ) ^ ( ~B v ~C ) ^ ( ~B v ~D ) ^ ( ~B v ~E ) ^ ( C v ~C ) ^ ( C v ~D ) ^ ( C v ~E ) */ string expected = "( A v ~C ) ^ ( A v ~D ) ^ ( A v ~E ) ^ ( ~B v ~C ) ^ ( ~B v ~D ) ^ ( ~B v ~E ) ^ ( C v ~C ) ^ ( C v ~D ) ^ ( C v ~E )"; Assert.AreEqual(expected, s.GetNegation().ToString(), "Negation result is incorrect"); }
public static void basicTests() { Console.WriteLine("******************** start basicTests ********************"); Sentence theSentence = new Sentence(); Clause tempClause = new Clause(); Literal tempLiteral = new Literal("", "A"); Console.WriteLine("tempLiteral (should be 'A')\n" + tempLiteral); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("~", "B"); Console.WriteLine("tempLiteral (should be '~B')\n" + tempLiteral); tempClause.AddLiteral(tempLiteral); Console.WriteLine("tempClause (should be '( A v ~B )')\n" + tempClause); theSentence.AddClause(tempClause); Console.WriteLine("theSentence (should be '( A v ~B )')\n" + theSentence); tempClause = new Clause(); tempLiteral = new Literal("", "B"); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("~", "D"); tempClause.AddLiteral(tempLiteral); theSentence.AddClause(tempClause); Console.WriteLine("theSentence (should be '( A v ~B ) ^ ( B v ~D )'\n" + theSentence); tempClause = new Clause(); tempLiteral = new Literal("", "E"); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("~", "F"); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("~", "A"); tempClause.AddLiteral(tempLiteral); theSentence.AddClause(tempClause); Console.WriteLine("theSentence (should be '( A v ~B ) ^ ( B v ~D ) ^ ( E v ~F v ~A )'\n" + theSentence); tempLiteral = new Literal("", "A"); Console.WriteLine("tempLiteral (should be 'A')\n" + tempLiteral); tempLiteral = tempLiteral.GetNegation(); Console.WriteLine("negation of tempLiteral (should be '~A')\n" + tempLiteral); tempLiteral = tempLiteral.GetNegation(); Console.WriteLine("negation of negation of tempLiteral (should be 'A')\n" + tempLiteral); tempClause = new Clause(); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("", "B"); tempClause.AddLiteral(tempLiteral); Console.WriteLine("tempClause (should be '( A v B )'\n" + tempClause); Sentence negatedTempClause = tempClause.GetNegation(); Console.WriteLine("negatedTempClause (should be '( ~A ) ^ ( ~B )'\n" + negatedTempClause); Sentence negatedSentence = negatedTempClause.GetNegation(); Console.WriteLine("negatedSentence (should be '( A v B )'\n" + tempClause); Console.WriteLine("======="); Console.WriteLine("======="); Sentence testerSentence = new Sentence(); tempClause = new Clause(); tempLiteral = new Literal("~", "A"); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("", "B"); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("~", "C"); tempClause.AddLiteral(tempLiteral); Console.WriteLine("tempClause (should be '( ~A v B v ~C )'\n" + tempClause); testerSentence.AddClause(tempClause); Console.WriteLine("testerSentence (should be '( ~A v B v ~C )'\n" + testerSentence); tempClause = new Clause(); tempLiteral = new Literal("", "C"); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("", "D"); tempClause.AddLiteral(tempLiteral); tempLiteral = new Literal("", "E"); tempClause.AddLiteral(tempLiteral); Console.WriteLine("tempClause (should be '( C v D v E )'\n" + tempClause); testerSentence.AddClause(tempClause); Console.WriteLine("testerSentence (should be '( ~A v B v ~C ) ^ ( C v D v E )'\n" + testerSentence); //WE START WITH ( ~A v B v ~C ) ^ ( C v D v E ) //NEGATE IT ~ ( ( ~A v B v ~C ) ^ ( C v D v E ) ) //DeMorgan's gives us ~ ( ~A v B v ~C ) v ~ ( C v D v E ) //DeMorgan's again ( A ^ ~B ^ C ) v (~C ^ ~D ^ ~E ) //now do distribution to arrive at CNF /// ( A v ~C) ^ ( A v ~D ) ^ ( A v ~E ) ^ ( ~B v ~C ) ^ ( ~B v ~D ) ^ ( ~B v ~E ) ^ ( C v ~C ) ^ ( C v ~D ) ^ ( C v ~E ) Sentence negatedTesterSentence = testerSentence.GetNegation(); Console.WriteLine("negatedTesterSentence (should be '( A v ~C ) ^ ( A v ~D ) ^ ( A v ~E ) ^ ( ~B v ~C ) ^ ( ~B v ~D ) ^ ( ~B v ~E ) ^ ( C v ~C ) ^ ( C v ~D ) ^ ( C v ~E ) \n" + " '\n" + negatedTesterSentence); Console.WriteLine("******************** end basicTests ********************"); }