HOWTO在Prolog中捕获超时异常
问题描述:
我想限制prolog中算法的执行。你能给我一个提示,怎么做?我发现了这个谓词:call_with_time_limit如何捕获time_limit_exceeded异常?由于HOWTO在Prolog中捕获超时异常
UPDATE:
我想这样说:
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.
但注意到happend当我叫暂停(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:
问题解决了,就必须有predcate “论据” 与大写...
答
使用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
我找到了很好的教程:https://wiki.colby.edu/display/~amvartan/Exception+and+Error+Handling+in+Prolog – 2011-04-19 19:19:25
答
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
变量开始以大写字母,即吨 - > T. – Kaarel 2011-04-20 12:49:33
也许HTTP的副本: //stackoverflow.com/questions/23900469/catch-3-and-call-with-time-limit-2-predicates-in-swi-prolog。 – 2015-10-31 20:57:09
可能重复,但在3年前创建。 – 2015-11-03 11:34:29