我如何推迟推迟执行?
我可以在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秒),然后它会立即显示所有文本?我该如何防止这种情况?
答案 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).