Next: 単一化ゴールのエンキュー: enqueue_unify_goal()
Up: 単一化器: do_unify()
Previous: resume_goals()の詳細
この関数は、generatorのactive_unify メソッドを起動し結果に応じて、
単一化の処理を行う。片方はgeneratorであることが確定し、
もう一方は、hook構造体である(つまり、goal/consumer/generatorのいずれかである)
ことが確定している時に呼びだされる。
関数仕様は以下である。
static Inline q*
generator_unify(gsx, sy, allocp)
struct generator_susp *gsx;
struct susprec *sy;
q *allocp;
引数は、gsx は、generator_susp 型構造へのポインタ、
sy はsusprecへのポインタを持つ。
- 1.
- まず、gsxの先のgeneratorに対して、sy を引数として
active_unify() メソッドを起動する。
- 結果が0以外のものでなければ、
単一化処理は、当該メソッド中で行われたので、終了する
(このとき、戻り値はheap topを示している)。
- 結果が0であれば、当該メソッドの実行は拒否されたことになるので、
以下の処理を続ける。
- 2.
- sy の先を調べる。
- syの先もgeneratorであることが判明したならば、
gsxを引数とし、syの先のオブジェクトにactive_unify()を起動する。
- 戻り値が0以外であれば、それをheap topと解釈し終了。
- 戻り値が0であれば、sy側もunifyが失敗したことを示すので、
基本的にはgsx, sy共にgenerate methodを発行し、単一化する。
すなわち、gsx側のobjectにgenerateメソッドを発行する。
その結果、戻り値が
- makeref(0)であれば、メモリ不足であったことを意味する。
よって、sy の先のgeneratorに対してもgenerateを発行する。
その結果、
- makeref(0)がもどれば、後に再度
単一化を行うため、enqueue_unify_goal()により、
単一化ゴールをエンキューする。
- makecons(0) であれば、異常終了。
- 上記以外であれば、syはその値に変身したことを示す。
sy のエントリをまずその値で具体化し、do_unify()により
gsx と再度単一化を試みる。
- makecons(0)であれば、異常終了。
- 上記以外であれば、gsxはその値に変身したことを示すので、
gsxのエントリをその値に具体化し、syと再度do_unify()により単一化を行う。
- sy の先はgeneratorではない(consumer/goalである)ことが判明した場合には、
gsxに対して、generateの処理を行い、戻り値に応じて、enqueue_unifyをかけるなり
生成された値とsyとの単一化を行うなりする。
Sekita Daigo
1998-05-18