public void testTermEquality()
{
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addFunction("Plus");
FOLParser parser = new FOLParser(domain);
TermEquality te1 = (TermEquality)parser.parse("x = x");
TermEquality te2 = (TermEquality)parser.parse("x = x");
// Both term equalities the same,
// should unify but no substitutions.
Dictionary<Variable, Term> result = unifier.unify(te1, te2);
Assert.IsNotNull(result);
Assert.AreEqual(0, result.Count);
// Different variable names but should unify.
te1 = (TermEquality)parser.parse("x1 = x1");
te2 = (TermEquality)parser.parse("x2 = x2");
result = unifier.unify(te1, te2);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual("{x1=x2}", result.ToString());
// Test simple unification with reflexivity axiom
te1 = (TermEquality)parser.parse("x1 = x1");
te2 = (TermEquality)parser.parse("Plus(A,B) = Plus(A,B)");
result = unifier.unify(te1, te2);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual("{x1=Plus(A,B)}", result.ToString());
// Test more complex unification with reflexivity axiom
te1 = (TermEquality)parser.parse("x1 = x1");
te2 = (TermEquality)parser.parse("Plus(A,B) = Plus(A,z1)");
result = unifier.unify(te1, te2);
Assert.IsNotNull(result);
Assert.AreEqual(2, result.Count);
Assert.AreEqual("{x1=Plus(A,B), z1=B}", result.ToString());
// Test reverse of previous unification with reflexivity axiom
// Should still be the same.
te1 = (TermEquality)parser.parse("x1 = x1");
te2 = (TermEquality)parser.parse("Plus(A,z1) = Plus(A,B)");
result = unifier.unify(te1, te2);
Assert.IsNotNull(result);
Assert.AreEqual(2, result.Count);
Assert.AreEqual("{x1=Plus(A,B), z1=B}", result.ToString());
// Test with nested terms
te1 = (TermEquality)parser
.parse("Plus(Plus(Plus(A,B),B, A)) = Plus(Plus(Plus(A,B),B, A))");
te2 = (TermEquality)parser
.parse("Plus(Plus(Plus(A,B),B, A)) = Plus(Plus(Plus(A,B),B, A))");
result = unifier.unify(te1, te2);
Assert.IsNotNull(result);
Assert.AreEqual(0, result.Count);
// Simple term equality unification fails
te1 = (TermEquality)parser.parse("Plus(A,B) = Plus(B,A)");
te2 = (TermEquality)parser.parse("Plus(A,B) = Plus(A,B)");
result = unifier.unify(te1, te2);
Assert.IsNull(result);
}