!752 static class Var extends Lisp { Lisp instance; *(S name) { super(name); instance = this; } } static boolean unify(Lisp thiz, Lisp t) { if (thiz instanceof Var) { Var v = cast thiz; if (v.instance != v) return unify(v.instance, t); //Trail::Push(v); v.instance = t; return true; } return unify2(t, thiz); } static boolean unify2(Lisp thiz, Lisp t) { if (thiz instanceof Var) return unify(thiz, t); int arity = thiz.size(); if (neq(thiz.head, t.head) || arity != t.size()) return false; for (int i = 0; i < arity; i++) if (!unify(thiz.get(i), t.get(i))) return false; return true; } p { Var x = new Var("X"); print(x + " = " + x.instance); print(unify(x, lisp("hello"))); print(x + " = " + x.instance); }