HOWTO在Prolog中捕获超时异常

Mar*_*lch 4 timeout exception prolog swi-prolog

我想在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.
Run Code Online (Sandbox Code Playgroud)

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

prolog :-
timeout(1), 
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候:

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.
Run Code Online (Sandbox Code Playgroud)

并再次调用超时(1)一切都很好.为什么?谢谢 更新2:

问题解决了,有必要用大写来预测"论证"......

Fre*_*Foo 5

使用catch/3.例:

catch(call_with_time_limit(1,
                           sleep(5)),
      time_limit_exceeded,
      writeln('overslept!')).
Run Code Online (Sandbox Code Playgroud)

更实际的是:

catch(call_with_time_limit(T, heavy_computation(X)),
      time_limit_exceeded,
      X = no_answer).  % or just fail
Run Code Online (Sandbox Code Playgroud)