cha*_*sey 5
和运算reset
符shift
最初来自Danvy;菲林斯基,1990。“抽象控制”。Haskell Control.Monad.Trans.Cont中的对应接口符合原始语义,除了一些类型限制。SWI-Prolog 中的分隔延续接口并不完全是原始的reset
和shift
. 它们与Felleisen,1988 的 prompt and control或Sitaram 的 fcontrol and run 操作符关系更密切。
通常,将分隔的延续程序从 Haskell 转换为 Prolog 并不困难。您的示例中的困难在于它esc
使用不同的值两次调用相同的延续。例如,
example :-
reset(step, ball(X), Cont),
X=1, call(Cont),
X=2, call(Cont).
第一个之后call(Cont)
,X
已经绑定了1
,不能再绑定了2
。
TomSchrijvers 的建议是使用copy_term/2使用新的统一变量创建延续的副本(是的,延续也是 SWI-Prolog 中的术语!),因此与您的示例等效的 Prolog 是
example(X) :-
reset(step, Ball, Cont),
copy_term(Cont+Ball, Cont1+Ball1),
copy_term(Cont+Ball, Cont2+Ball2),
writeln("charlie"),
ball(X1) = Ball1,
X1=1, reset(Cont1, _, _),
writeln("delta"),
ball(X2) = Ball2,
X2=2, reset(Cont2, _, _),
X=0.
step :-
writeln("alfa"),
writeln("bravo"),
shift(ball(X)),
format("zulu ~w~n", X),
shift(ball(X)).
?- example(X).
alfa
bravo
charlie
zulu 1
delta
zulu 2
X = 0.
更多详细讨论,请参见swi-prolog.discourse.group/t/naming-clarification-about-delimited-continuation-reset-3-and-shift-1
更多推荐
有何不同,语言,与其他,Prolog,shift
发布评论