2011-04-19 92 views
4

我想限制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 「論據」 與大寫...

+1

變量開始以大寫字母,即噸 - > T. – Kaarel 2011-04-20 12:49:33

+0

也許HTTP的副本: //stackoverflow.com/questions/23900469/catch-3-and-call-with-time-limit-2-predicates-in-swi-prolog。 – 2015-10-31 20:57:09

+0

可能重複,但在3年前創建。 – 2015-11-03 11:34:29

回答

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

我找到了很好的教程:https://wiki.colby.edu/display/~amvartan/Exception+and+Error+Handling+in+Prolog – 2011-04-19 19:19:25

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