在prolog中延迟执行?

时间:2013-03-19 15:29:16

标签: prolog

我如何推迟推迟执行? 我可以在Haskell中执行threadDelay ms以将其延迟ms毫秒。在prolog中有没有办法做到这一点? 我的意思是我可能只是做一些像

这样的空查询
delay(0).
delay(X) :- delay(Y), Y is X - 1.

但这似乎是一个愚蠢而错误的想法。

编辑:

显然有sleep/1。 但是,当我做

之类的事情时
delayText([H|T]) :- put_char(H), sleep(0.1), delayText(T).
delayText([]).

,首先执行睡眠(因此在查询delayText("Hello").或其他东西时会睡眠0.5秒),然后它会立即显示所有文本?我该如何防止这种情况?

1 个答案:

答案 0 :(得分:1)

为了正式回答我的答案,在SWI-Prolog中你可以使用sleep/1来推迟这个过程。我没有看到ISO谓词in this list,我不会指望它,因为标准并没有真正指定线程或其他低级操作系统问题。

要修复delayText/1,您只需添加flush_output即可。这与Haskell中的hFlush stdout基本相同,但您也可以使用hSetBuffering更改Haskell中输出流的刷新模式。 SWI版本open/4支持buffer选项,但它提到这不是ISO,因此可能没有ISO方法导致刷新自动发生或使输出无缓冲,尽管希望如此如果我错了,那么对标准有更多经验的人会出现并纠正我。

更正后的代码如下所示:

delayText([H|T]) :- put_char(H), flush_output, sleep(0.1), delayText(T).
delayText([]).

我可能会这样写:

delay_put_char(X) :- put_char(X), flush_output, sleep(0.1).
delayText(X) :- maplist(delay_put_char, X).