public void testNonTrivialFactors()
{
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addFunction("F");
domain.addFunction("G");
domain.addFunction("H");
domain.addPredicate("P");
domain.addPredicate("Q");
FOLParser parser = new FOLParser(domain);
// p(x,y), q(a,b), p(b,a), q(y,x)
Clause c = new Clause();
c.addPositiveLiteral((Predicate)parser.parse("P(x,y)"));
c.addPositiveLiteral((Predicate)parser.parse("Q(A,B)"));
c.addNegativeLiteral((Predicate)parser.parse("P(B,A)"));
c.addPositiveLiteral((Predicate)parser.parse("Q(y,x)"));
Assert.AreEqual("[[~P(B,A), P(B,A), Q(A,B)]]", c
.getNonTrivialFactors().ToString());
// p(x,y), q(a,b), p(b,a), q(y,x)
c = new Clause();
c.addPositiveLiteral((Predicate)parser.parse("P(x,y)"));
c.addPositiveLiteral((Predicate)parser.parse("Q(A,B)"));
c.addNegativeLiteral((Predicate)parser.parse("P(B,A)"));
c.addNegativeLiteral((Predicate)parser.parse("Q(y,x)"));
Assert.AreEqual("[]", c.getNonTrivialFactors().ToString());
// p(x,f(y)), p(g(u),x), p(f(y),u)
c = new Clause();
c.addPositiveLiteral((Predicate)parser.parse("P(x,F(y))"));
c.addPositiveLiteral((Predicate)parser.parse("P(G(u),x)"));
c.addPositiveLiteral((Predicate)parser.parse("P(F(y),u)"));
// Should be: [{P(F(c#),F(c#)),P(G(F(c#)),F(c#))}]
c = c.getNonTrivialFactors().First();
Literal p = c.getPositiveLiterals()[0];
Assert.AreEqual("P", p.getAtomicSentence().getSymbolicName());
Function f = (Function)p.getAtomicSentence().getArgs()[0];
Assert.AreEqual("F", f.getFunctionName());
Variable v = (Variable)f.getTerms()[0];
f = (Function)p.getAtomicSentence().getArgs()[1];
Assert.AreEqual("F", f.getFunctionName());
Assert.AreEqual(v, f.getTerms()[0]);
//
p = c.getPositiveLiterals()[1];
f = (Function)p.getAtomicSentence().getArgs()[0];
Assert.AreEqual("G", f.getFunctionName());
f = (Function)f.getTerms()[0];
Assert.AreEqual("F", f.getFunctionName());
Assert.AreEqual(v, f.getTerms()[0]);
f = (Function)p.getAtomicSentence().getArgs()[1];
Assert.AreEqual("F", f.getFunctionName());
Assert.AreEqual(v, f.getTerms()[0]);
// p(g(x)), q(x), p(f(a)), p(x), p(g(f(x))), q(f(a))
c = new Clause();
c.addPositiveLiteral((Predicate)parser.parse("P(G(x))"));
c.addPositiveLiteral((Predicate)parser.parse("Q(x)"));
c.addPositiveLiteral((Predicate)parser.parse("P(F(A))"));
c.addPositiveLiteral((Predicate)parser.parse("P(x)"));
c.addPositiveLiteral((Predicate)parser.parse("P(G(F(x)))"));
c.addPositiveLiteral((Predicate)parser.parse("Q(F(A))"));
Assert.AreEqual("[[P(F(A)), P(G(F(F(A)))), P(G(F(A))), Q(F(A))]]",
c.getNonTrivialFactors().ToString());
}