cha*_*sey 5

和运算resetshift最初来自Danvy;菲林斯基,1990。“抽象控制”。Haskell Control.Monad.Trans.Cont中的对应接口符合原始语义,除了一些类型限制。SWI-Prolog 中的分隔延续接口并不完全是原始的resetshift. 它们与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