back numbers

7.12.2008

Continuation on Prolog

Prologを実装するために継続を利用する事例は数有れど、その逆は稀有である。当然の話ではあるが、基本的にPrologのセマンティクス自体は継続が無ければ実現出来ない機構であるため、改めて継続を明示的に利用するケースはほとんど無いからである。だがしかし、もし敢えてそれに及ばなければならないとしたら、そんな場合のちょっとしたコツもある。

% 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 件のコメント:

tags

Profile

Taito, Tokyo, Japan
明けども明けども次の埒
hiro.kosh@gmail.com