首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWI中的catch/3和call_with_call/2谓词

SWI中的catch/3和call_with_call/2谓词
EN

Stack Overflow用户
提问于 2014-05-27 23:18:44
回答 2查看 812关注 0票数 7

我想用

代码语言:javascript
复制
catch(:Goal, +Catcher, :Recover)

目标在哪里

代码语言:javascript
复制
call_with_time_limit(+Time, :Goal)

这件事搞砸了,我找不到正确的方法来知道上面的一件事是什么时候发生的:

1)进球因暂停而停止。

2)目标失败(有时应该失败)。

我试过:

代码语言:javascript
复制
(catch(call_with_time_limit(Time, Goal), Catcher, Recover) ->
(ground(Catcher), Catcher = time_limit_exceeded), **TIMEOUT ACTIONS**)
;
(**SUCCESS ACTIONS**))
;
**FAILURE ACTIONS**
)

*编辑*

模式:

我使用以下模式:

代码语言:javascript
复制
((catch(call_with_time_limit(6,goal),
    Exception,
    true),(var(Exception);Exception=time_limit_exceeded))
->
    (var(Exception) -> writeln(succ) ; writeln(timeout))
;
    writeln(fail)
).

这个模式在4秒或更长的时间内不起作用--它只是忽略了超时请求。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-28 09:53:59

你的问题涉及两个不同的部分。首先,如何使用catch/3来处理这种情况。然后是超时机制本身。

catch/3捕获错误和异常

一般来说,使用catch/3最惯用的方式如下:

代码语言:javascript
复制
   ...,
   catch((R = success, Goal), Pat, R = error(Pat)),
   ...

但是,捕获所有错误/异常通常会导致容易出错的程序,因为严重的、意外的错误可能会被掩盖。

在特定情况下,您只想捕获单个模式,因此:

代码语言:javascript
复制
   ...,
   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时间。接口是:

代码语言:javascript
复制
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可能是您的一种选择。

票数 5
EN

Stack Overflow用户

发布于 2014-05-28 00:23:05

尝试以下模式:

代码语言:javascript
复制
(   catch(call_with_time_limit(Time,Goal), Error, true) ->
    (   var(Error) ->
        % success actions
    ;   % error actions
    )
;   % failure actions
).
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23900469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档