exception - Excepción de catch timeout en Prolog
swi-prolog (2)
Use catch/3
. Ejemplo:
catch(call_with_time_limit(1,
sleep(5)),
time_limit_exceeded,
writeln(''overslept!'')).
Más practicamente:
catch(call_with_time_limit(T, heavy_computation(X)),
time_limit_exceeded,
X = no_answer). % or just fail
Quiero limitar la "ejecución" de algoritmo en prolog. ¿Me puede dar una pista, cómo hacerlo? He encontrado este predicado: call_with_time_limit ¿Cómo puedo capturar la excepción time_limit_exceeded? Gracias
ACTUALIZAR:
Lo intento de esta manera:
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.
pero observando sucedió cuando llamo a tiempo de espera (1):
prolog :-
timeout(1),
pero cuando lo hago de esta manera:
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.
y de nuevo call timeout (1) todo está bien. ¿Por qué? Gracias ACTUALIZACIÓN 2:
Problema resuelto, es necesario tener un "argumento" predicho con mayúsculas ...
loop :- loop.
loop_for_n_sec(N, Catcher) :-
catch(
call_with_time_limit(N, loop),
Catcher,
true
).
Uso:
?- loop_for_n_sec(1, Catcher).
Catcher = time_limit_exceeded