Exception 如何在Prolog中捕获超时异常

Exception 如何在Prolog中捕获超时异常,exception,timeout,prolog,swi-prolog,Exception,Timeout,Prolog,Swi Prolog,我想限制prolog中算法的“执行”。你能给我一个提示,怎么做吗?我发现了这样一个谓词:如何捕获时间限制超出的异常?谢谢 更新: 我试着这样做: 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) :-

我想限制prolog中算法的“执行”。你能给我一个提示,怎么做吗?我发现了这样一个谓词:如何捕获时间限制超出的异常?谢谢

更新:

我试着这样做:

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.
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)时,没有发生什么:

但当我这样做的时候:

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.
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.
再次呼叫超时(1)一切正常。 为什么?谢谢 更新2:

问题解决后,有必要将“参数”预先定义为大写…

使用。例如:

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
用法:

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

我发现了一个很好的教程:变量以大写字母开头,即t->t。可能是的一个副本。可能是重复的,但在3年前创建的。