【问题标题】:HOWTO catch timeout exception in Prolog如何在 Prolog 中捕获超时异常
【发布时间】:2011-08-08 22:33:39
【问题描述】:

我想限制 prolog 中算法的“执行”。你能给我一个提示吗,怎么做?我找到了这个谓词:call_with_time_limit 如何捕获 time_limit_exceeded 异常?谢谢

更新:

我正在尝试这样:

timeout(t) :-
    catch(call_with_time_limit(t, sleep(5)), X, error_process(X)).

error_process(time_limit_exceeded) :- write('Timeout exceeded'), nl, halt.
error_process(X) :- write('Unknown Error' : X), nl, halt.

但注意到当我调用 timeout(1) 时发生了:

prolog :-
timeout(1), 

但是当我这样做时:

runStart :- call_with_time_limit(1, sleep(5)).

timeout(1) :-
    catch(runStart, X, error_process(X)).

error_process(time_limit_exceeded) :- write('Timeout exceeded'), nl, halt.
error_process(X) :- write('Unknown Error' : X), nl, halt.

再次调用 timeout(1) 一切正常。 为什么?谢谢 更新 2:

问题解决了,有必要在“参数”前面加上大写...

【问题讨论】:

标签: exception timeout prolog swi-prolog


【解决方案1】:

使用catch/3。示例:

catch(call_with_time_limit(1,
                           sleep(5)),
      time_limit_exceeded,
      writeln('overslept!')).

更实际:

catch(call_with_time_limit(T, heavy_computation(X)),
      time_limit_exceeded,
      X = no_answer).  % or just fail

【讨论】:

【解决方案2】:
loop :- loop.

loop_for_n_sec(N, Catcher) :-
    catch(
        call_with_time_limit(N, loop),
        Catcher,
        true
    ).

用法:

?- loop_for_n_sec(1, Catcher).
Catcher = time_limit_exceeded

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多