我想用
catch(:Goal, +Catcher, :Recover)目标在哪里
call_with_time_limit(+Time, :Goal)这件事搞砸了,我找不到正确的方法来知道上面的一件事是什么时候发生的:
1)进球因暂停而停止。
2)目标失败(有时应该失败)。
我试过:
(catch(call_with_time_limit(Time, Goal), Catcher, Recover) ->
(ground(Catcher), Catcher = time_limit_exceeded), **TIMEOUT ACTIONS**)
;
(**SUCCESS ACTIONS**))
;
**FAILURE ACTIONS**
)*编辑*
模式:
我使用以下模式:
((catch(call_with_time_limit(6,goal),
Exception,
true),(var(Exception);Exception=time_limit_exceeded))
->
(var(Exception) -> writeln(succ) ; writeln(timeout))
;
writeln(fail)
).这个模式在4秒或更长的时间内不起作用--它只是忽略了超时请求。
发布于 2014-05-28 09:53:59
你的问题涉及两个不同的部分。首先,如何使用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)可能是最先进的,最初是在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可能是您的一种选择。
发布于 2014-05-28 00:23:05
尝试以下模式:
( catch(call_with_time_limit(Time,Goal), Error, true) ->
( var(Error) ->
% success actions
; % error actions
)
; % failure actions
).https://stackoverflow.com/questions/23900469
复制相似问题