public void testQuantifiedSentence()
{
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addConstant("C");
domain.addFunction("Plus");
domain.addPredicate("P");
FOLParser parser = new FOLParser(domain);
Sentence s1 = parser
.parse("FORALL x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
Sentence s2 = parser
.parse("FORALL x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
Dictionary<Variable, Term> result = unifier.unify(s1, s2);
Assert.IsNotNull(result);
Assert.AreEqual(0, result.Count);
s1 = parser.parse("FORALL x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
s2 = parser.parse("FORALL x ((P(x) AND P(A)) OR (P(A) => P(y)))");
result = unifier.unify(s1, s2);
Assert.IsNull(result);
s1 = parser.parse("FORALL x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
s2 = parser.parse("FORALL x,y ((P(x) AND P(A)) OR (P(B) => P(y)))");
result = unifier.unify(s1, s2);
Assert.IsNull(result);
s1 = parser.parse("FORALL x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
s2 = parser.parse("FORALL x,y ((P(A) AND P(A)) OR (P(A) => P(y)))");
result = unifier.unify(s1, s2);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual(new Constant("A"), result[new Variable("x")]);
//
s1 = parser.parse("EXISTS x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
s2 = parser.parse("EXISTS x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
result = unifier.unify(s1, s2);
Assert.IsNotNull(result);
Assert.AreEqual(0, result.Count);
s1 = parser.parse("EXISTS x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
s2 = parser.parse("EXISTS x ((P(x) AND P(A)) OR (P(A) => P(y)))");
result = unifier.unify(s1, s2);
Assert.IsNull(result);
s1 = parser.parse("EXISTS x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
s2 = parser.parse("EXISTS x,y ((P(x) AND P(A)) OR (P(B) => P(y)))");
result = unifier.unify(s1, s2);
Assert.IsNull(result);
s1 = parser.parse("EXISTS x,y ((P(x) AND P(A)) OR (P(A) => P(y)))");
s2 = parser.parse("EXISTS x,y ((P(A) AND P(A)) OR (P(A) => P(y)))");
result = unifier.unify(s1, s2);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual(new Constant("A"), result[new Variable("x")]);
}
}