エンキューされるゴールの述語は runtime/uterms.kl1で定義されているunify_terms_dcode:unifyであり、 以下のようなものである。
unify(X,Y) :-
functor(X,PX,AX),
functor(Y,PY,AY),
AX =:= AY |
unify_pf(PX,PY),
unify_args(AX,X,Y).
unify_pf(PX,PY) :-
inline:"
if (isatomic(%0)) {
if (%0 != %1) goto %f;
} else if (isatomic(%1)) {
goto %f;
} else {
generic_active_unify(data_objectp(%0),
data_objectp(%1),allocp);
}":[PX+bound,PY+bound] | true.
unify_args(0,_,_):- true | true.
unify_args(N,X,Y):- N>0,
arg(N,X,EX), arg(N,Y,EY) |
EX=EY, N1:=N-1, unify_args(N1,X,Y).
unify_pfの一部でinlineが利用されている以外は全く簡単な述語である。
inline部は、双方がdata objectであるときの処理を行っている。
Data objectはまずfunctorとして見えるため、このような処理が妥当である。