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