public void testAdditionalVariableMixtures()
{
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addFunction("F");
domain.addFunction("G");
domain.addFunction("H");
domain.addPredicate("P");
FOLParser parser = new FOLParser(domain);
// Test Cascade Substitutions handled correctly
Sentence s1 = parser.parse("P(z, x)");
Sentence s2 = parser.parse("P(x, a)");
Dictionary<Variable, Term> result = unifier.unify(s1, s2);
Assert.AreEqual("{z=a, x=a}", result.ToString());
s1 = parser.parse("P(x, z)");
s2 = parser.parse("P(a, x)");
result = unifier.unify(s1, s2);
Assert.AreEqual("{x=a, z=a}", result.ToString());
s1 = parser.parse("P(w, w, w)");
s2 = parser.parse("P(x, y, z)");
result = unifier.unify(s1, s2);
Assert.AreEqual("{w=z, x=z, y=z}", result.ToString());
s1 = parser.parse("P(x, y, z)");
s2 = parser.parse("P(w, w, w)");
result = unifier.unify(s1, s2);
Assert.AreEqual("{x=w, y=w, z=w}", result.ToString());
s1 = parser.parse("P(x, B, F(y))");
s2 = parser.parse("P(A, y, F(z))");
result = unifier.unify(s1, s2);
Assert.AreEqual("{x=A, y=B, z=B}", result.ToString());
s1 = parser.parse("P(F(x,B), G(y), F(z,A))");
s2 = parser.parse("P(y, G(F(G(w),w)), F(w,z))");
result = unifier.unify(s1, s2);
Assert.IsNull(result);
s1 = parser.parse("P(F(G(A)), x, F(H(z,z)), H(y, G(w)))");
s2 = parser.parse("P(y, G(z), F(v ), H(F(w), x ))");
result = unifier.unify(s1, s2);
Assert.AreEqual(
"{y=F(G(A)), x=G(G(A)), v=H(G(A),G(A)), w=G(A), z=G(A)}",
result.ToString());
}