3

プロローグでのアルゴリズムの「実行」を制限したい。ヒントを教えていただけますか、その方法を教えてください。この述語を見つけました: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.

しかし、timeout(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)を呼び出して、すべて問題ありません。なんで?UPDATE 2に感謝 します:

問題は解決しました。大文字で「引数」を予測する必要があります。

4

2 に答える 2

4

を使用し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
于 2011-04-19T19:09:42.560 に答える
2
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
于 2011-04-19T19:13:00.897 に答える