@Override public Term applySubst(Substitution s) { Term value = (s == null) ? null : s.get(this); return (value == null) ? this : value; }
@Override public default Substitution unify(Term x, Substitution s) { if (s == null) { return null; } else if (equals(x)) { return s; } PrologTerm st = (PrologTerm) s.get(this); if (st != null) { return st.unify(x, s); } PrologTerm sx = (x instanceof Var) ? (PrologTerm) s.get((Var) x) : null; if (sx != null) { return unify(sx, s); } else if (x.getFreeVar().contains(this)) { return null; } else { s.addBinding(this, x); return s; } } }