% call_ac/2
call_ac(Pred, Cont) :-
Pred =.. [_|Args], % 節に単一化される引数を補足しておく
Pred, % 述語が評価される
Cont =.. [cont, Args, Body], % 次の継続に現時点で単一化されている変数を渡す
Body. % 先の述語で確定した変数で継続を実行
?- call_ac(fact(10, Ans),
cont([X, Y],
(write('fact '), write(X), write(' is '), write(Y), nl))).
fact 10 is 3628800
Ans = 3628800,
X = 10,
Y = 3628800.
残念ながら Scheme のように現在の継続を取得する述語は ISO-Prolog に存在しない(当然だが現在の継続そのものはスタックに積まれている、更に
直前に選択した継続の予備 = バックトラック候補も別のスタックに一つ割当られている)ため、明示的に継続を渡す必要がある。call/cc の代わりに call with a continuation である。この作業はいうなれば Prolog の実行手順を再現しているようなもので、順番に述語を評価し、束縛された変数を次の述語に束縛する。このような
数珠繋ぎの関係こそが逐次的な関係の論理的な意味づけなのだ。
0 件のコメント:
コメントを投稿