@Override public boolean unify(Term t1) { // used to be implemented using recursion but caused stack overflow problems with long lists Term t2 = this; do { TermType tType = t1.getType(); if (tType == TermType.LIST) { if (t2.getArgument(0).unify(t1.getArgument(0)) == false) { return false; } t1 = t1.getArgument(1); t2 = t2.getArgument(1); } else if (tType.isVariable()) { return t1.unify(t2); } else { return false; } } while (t2.getType() == TermType.LIST); return t2.unify(t1); }