КАК поймать исключение тайм-аута в Прологе

Я хочу ограничить «выполнение» алгоритма в прологе. Можете подсказать, как это сделать? Я нашел этот предикат: 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.

и снова вызов timeout(1) все в порядке. Почему? Спасибо ОБНОВЛЕНИЕ 2:

Проблема решена, необходимо иметь предкат "аргумент" с заглавными буквами...


person Martin Pilch    schedule 19.04.2011    source источник
comment
Переменные начинаются с заглавной буквы, т.е. t -> T.   -  person Kaarel    schedule 20.04.2011
comment
Возможно, дубликат stackoverflow.com/questions/23900469/ .   -  person Mostowski Collapse    schedule 31.10.2015
comment
Может быть дубликатом, но созданным 3 года назад.   -  person Martin Pilch    schedule 03.11.2015


Ответы (2)


Используйте 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
person Fred Foo    schedule 19.04.2011
comment
Я нашел хороший учебник: wiki.colby.edu /display/~амвартан/ - person Martin Pilch; 19.04.2011

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
person Kaarel    schedule 19.04.2011