【发布时间】:2022-08-21 00:48:39
【问题描述】:
我在 Haskell here 中找到了一个移位重置分隔延续的示例:
resetT $ do alfa bravo x <- shiftT $ \\esc -> do charlie lift $ esc 1 delta lift $ esc 2 return 0 zulu x这将:
执行
alfa执行
bravo执行
charlie将
x绑定到1,从而执行zulu 1从
resetT的末尾掉下来,然后跳回到esc 1之后执行
delta将
x绑定到2,从而执行zulu 2从
resetT的末尾掉下来,然后跳回到esc 2之后逃离
resetT,导致它产生0我不知道如何使用 SWI-Prolog 的 shift/1 和 reset/3 编写等效代码。
下面的代码是我的尝试。输出是一样的,但看起来很乱而且倒退,我觉得我在滥用
Ball来获得类似于Haskell 示例中的esc 1和esc 2的东西。另外,我不确定如何处理return 0。% not sure about this... example :- reset(step, ball(X), Cont), ( writeln(\"charlie\"), X=1, call(Cont), fail ; writeln(\"delta\"), X=2, call(Cont)). step :- writeln(\"alfa\"), writeln(\"bravo\"), shift(ball(X)), format(\"zulu ~w~n\", X).我很困惑:Scheme/Haskell/ML-style shift-reset 和 Prolog shift-reset 看起来几乎是完全不同的东西!例如,您将 lambda 传递给 Haskell 的
shiftT,但您没有将目标传递给 Prolog 的 shift/1。Haskell 的
\\esc -> ... esc 1或return 0的Prolog 等价物在哪里? Prolog 的Ball或call(Cont)的 Haskell 等价物在哪里?我觉得上面 Haskell 示例的“正确”端口可以回答这些问题。
标签: haskell prolog swi-prolog continuations delimited-continuations