如何在 SWI-Prolog 上设置闹钟?
Posted
技术标签:
【中文标题】如何在 SWI-Prolog 上设置闹钟?【英文标题】:How to to set an alarm on SWI-Prolog? 【发布时间】:2014-06-13 19:15:29 【问题描述】:我正在尝试制作 5000 毫秒后在屏幕上打印的东西。 我正在使用此代码,5 秒后 Prolog 关闭。 我有这段代码要编译:
:- use_module(library(time)).
alarm:-
alarm(5, writeln(ouch), Id, [remove(true)]).
【问题讨论】:
您使用的是哪个 SWI-Prolog 版本? 我使用的是6.6.6版本 @SergeyDymchenko 您使用哪个版本的 Prolog?谢谢 @PedroSilva “SWI-Prolog(多线程,64 位,版本 6.2.6)”在 Linux 上。 在 Mac OS X 10.9 上运行的 SWI-Prolog 7.1.16 上,我只在调用alarm/0
谓词后打印原子 ouch
,如果我在顶层。在调用writeln/1
之后添加对flush_output/0
的调用并不能解决问题。这是您观察到的行为吗?在哪个操作系统中?
【参考方案1】:
警报机制通过发送信号来工作(参见thread_signal/2)。只有在 Prolog 很好地运行目标时,信号才会被可靠地捕获。一些长期运行的外国目标明确查询未决信号。一些阻塞目标也会处理它们,但这取决于操作系统。
处理时间的更可靠方法是使用线程。例如:
?- thread_create((sleep(5), writeln(ouch)), _, [detached(true)]).
true.
?- outch
或者,您必须确保发出警报的线程处于可以接收信号的状态。顶层不是(在所有平台上)。 AFAIK, sleep/1 是。因此,您可以确保线程正在运行(例如):
sleep :- sleep(1000), sleep.
【讨论】:
以上是关于如何在 SWI-Prolog 上设置闹钟?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 GNU-Emacs 在 SWI-Prolog 上编辑“Prolog 程序名称”(尝试设置劣质 Prolog 进程)