next up previous contents index
Next: ジェネリック・オブジェクト Up: 単一化器: do_unify() Previous: 単一化ゴールのエンキュー: enqueue_unify_goal()

複雑なゴールのエンキュー: enqueue_unify_terms()

これは、構造体同士の単一化を行うゴールをKL1レベルで実装したものを エンキューするのみである。

エンキューされるゴールの述語は 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として見えるため、このような処理が妥当である。


Sekita Daigo
1998-05-18