您的问题涉及两个不同的部分。一、方式如何catch/3
可以用来处理这样的情况。然后是超时机制本身。
捕获错误和异常catch/3
一般来说,最惯用的使用方式catch/3
就像这样:
...,
catch((R = success, Goal), Pat, R = error(Pat)),
...
然而,捕获所有错误/异常通常会导致程序容易出错,因为可能会掩盖严重的意外错误。
在您的特定情况下,您只想捕获单个模式,因此:
...,
catch((R = success, call_with_time_limit(Time,Goal)),
time_limit_exceeded,
R = timeout ),
...
请注意,使用以下命令测试未实例化的变量var(Pat)
可能是一个容易被忽略的错误来源。
处理超时
不同的系统提供了多种接口。但最根本的问题是你真正想要实现什么。您想要限制实时、CPU 时间还是仅限制资源?
time_out/3
in library(timeout) http://sicstus.sics.se/sicstus/docs/4.1.0/html/sicstus/lib_002dtimeout.html可能是最先进的,最初是在 1992 年为 SICStus Prolog 开发的。SWI 和 YAP 中有一些兼容的实现。但是,SWI 和 YAP 无法处理嵌套情况。而且SWI 不限制CPU 时间。界面是:
time_out(:Goal_0, +TimeMs, -Result)
call_with_time_limit/3
是 SWI 的一个相当特殊的内置函数,它不符合内置函数的常见约定。此外,它称其目标为once(Goal_0)
仅有的。我宁愿不。
call_with_inference_limit/3
目前仅出现在 SWI 的最新版本中,并使用类似的约定time_out/3
。它限制推理次数而不是 CPU 时间。因此,它非常适合检测程序员的循环,但可能不适合您的任务。
wait_for_input/3 http://www.swi-prolog.org/pldoc/man?predicate=wait_for_input/3如果您的超时仅与读取数据有关,这可能是您的一个选择。