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());
}