In the cond in the occurs? function, this condition:
(zip/end? z) false
appears twice. Unless I very much misunderstand, the second clause will never succeed.
Also, I'm wondering if it makes sense (in core.unify) for composite? to be true for strings. It looks like this means occurs? will futilely check each character of a string looking for variables.