AIMA.Test.Core.Unit.Logic.FOL.KB.Data.ClauseTest.testBinaryResolvents C# (CSharp) Method

testBinaryResolvents() private method

private testBinaryResolvents ( ) : void
return void
        public void testBinaryResolvents()
        {
            FOLDomain domain = new FOLDomain();
            domain.addPredicate("Pred1");
            domain.addPredicate("Pred2");
            domain.addPredicate("Pred3");
            domain.addPredicate("Pred4");

            Clause c1 = new Clause();

            // Ensure that resolving to self when empty returns an empty clause
            Assert.IsNotNull(c1.binaryResolvents(c1));
            Assert.AreEqual(1, c1.binaryResolvents(c1).Count);
            Assert.IsTrue(c1.binaryResolvents(c1)[0].isEmpty());

            // Check if resolve with self to an empty clause
            c1.addPositiveLiteral(new Predicate("Pred1", new List<Term>()));
            c1.addNegativeLiteral(new Predicate("Pred1", new List<Term>()));
            Assert.IsNotNull(c1.binaryResolvents(c1));
            Assert.AreEqual(1, c1.binaryResolvents(c1).Count);
            // i.e. resolving a tautology with a tautology gives you
            // back a tautology.
            Assert.AreEqual("[~Pred1(), Pred1()]", c1.binaryResolvents(c1)
                    [0].ToString());

            // Check if try to resolve with self and no resolvents
            c1 = new Clause();
            c1.addPositiveLiteral(new Predicate("Pred1", new List<Term>()));
            Assert.AreEqual(0, c1.binaryResolvents(c1).Count);

            c1 = new Clause();
            Clause c2 = new Clause();
            // Ensure that two empty clauses resolve to an empty clause
            Assert.IsNotNull(c1.binaryResolvents(c2));
            Assert.AreEqual(1, c1.binaryResolvents(c2).Count);
            Assert.IsTrue(c1.binaryResolvents(c2).First().isEmpty());
            Assert.IsNotNull(c2.binaryResolvents(c1));
            Assert.AreEqual(1, c2.binaryResolvents(c1).Count);
            Assert.IsTrue(c2.binaryResolvents(c1).First().isEmpty());

            // Enusre the two complementary clauses resolve
            // to the empty clause
            c1.addPositiveLiteral(new Predicate("Pred1", new List<Term>()));
            c2.addNegativeLiteral(new Predicate("Pred1", new List<Term>()));
            Assert.IsNotNull(c1.binaryResolvents(c2));
            Assert.AreEqual(1, c1.binaryResolvents(c2).Count);
            Assert.IsTrue(c1.binaryResolvents(c2).First().isEmpty());
            Assert.IsNotNull(c2.binaryResolvents(c1));
            Assert.AreEqual(1, c2.binaryResolvents(c1).Count);
            Assert.IsTrue(c2.binaryResolvents(c1).First().isEmpty());

            // Ensure that two clauses that have two complementaries
            // resolve with two resolvents
            c1.addPositiveLiteral(new Predicate("Pred1", new List<Term>()));
            c2.addNegativeLiteral(new Predicate("Pred1", new List<Term>()));
            c1.addPositiveLiteral(new Predicate("Pred2", new List<Term>()));
            c2.addNegativeLiteral(new Predicate("Pred2", new List<Term>()));
            Assert.IsNotNull(c1.binaryResolvents(c2));
            Assert.AreEqual(2, c1.binaryResolvents(c2).Count);
            Assert.IsNotNull(c2.binaryResolvents(c1));
            Assert.AreEqual(2, c2.binaryResolvents(c1).Count);

            // Ensure two clauses that factor are not
            // considered resolved
            c1 = new Clause();
            c2 = new Clause();
            c1.addPositiveLiteral(new Predicate("Pred1", new List<Term>()));
            c1.addPositiveLiteral(new Predicate("Pred2", new List<Term>()));
            c1.addNegativeLiteral(new Predicate("Pred3", new List<Term>()));
            c1.addNegativeLiteral(new Predicate("Pred4", new List<Term>()));
            c2.addPositiveLiteral(new Predicate("Pred2", new List<Term>()));
            c2.addNegativeLiteral(new Predicate("Pred4", new List<Term>()));
            Assert.IsNotNull(c1.binaryResolvents(c2));
            Assert.AreEqual(0, c1.binaryResolvents(c2).Count);
            Assert.IsNotNull(c2.binaryResolvents(c1));
            Assert.AreEqual(0, c2.binaryResolvents(c1).Count);

            // Ensure the resolvent is a subset of the originals
            c1 = new Clause();
            c2 = new Clause();
            c1.addPositiveLiteral(new Predicate("Pred1", new List<Term>()));
            c1.addNegativeLiteral(new Predicate("Pred2", new List<Term>()));
            c1.addNegativeLiteral(new Predicate("Pred3", new List<Term>()));
            c2.addPositiveLiteral(new Predicate("Pred2", new List<Term>()));
            Assert.IsNotNull(c1.binaryResolvents(c2));
            Assert.IsNotNull(c2.binaryResolvents(c1));
            Assert.AreEqual(1, c1.binaryResolvents(c2).First()
                    .getNumberPositiveLiterals());
            Assert.AreEqual(1, c1.binaryResolvents(c2).First()
                    .getNumberNegativeLiterals());
            Assert.AreEqual(1, c2.binaryResolvents(c1).First()
                    .getNumberPositiveLiterals());
            Assert.AreEqual(1, c2.binaryResolvents(c1).First()
                    .getNumberNegativeLiterals());
        }