我想在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.
但是当我调用超时(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.
再次调用超时(1)一切都很好。 为什么?谢谢 更新2:
问题解决了,有必要用大写字母预测“论证”...
答案 0 :(得分:5)
使用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
答案 1 :(得分:3)
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