2015-10-06 40 views
3

任何人都可以解釋爲什麼以下YAP代碼不會導致變量Resulttime_out統一?YAP PROLOG超時問題

?- time_out(sleep(3),1,Result). 
Result = success. 
?- time_out(sleep(3),2,Result). 
Result = success. 
?- time_out(sleep(3),1000,Result). 
Result = success. 
?- time_out(sleep(3),2000,Result). 

根據該documentation,謂詞應該工作如下:

time_out(+Goal, +Timeout, -Result)

執行目標Goal隨時間有限 Timeout,其中Timeout以毫秒爲單位。如果目標 成功,則統一Resultsuccess。如果計時器在 目標終止之前到期,則統一Resulttime_out

+1

哪個版本?編譯是否支持線程? –

+0

YAP 6.3.3沒有線程支持 – S0rin

回答

3

YAP的文檔還指出:

最後,即使計時器以毫秒爲單位設置,目前 實現依賴於alarm/3,因此只能提供以秒規模 精度。

反過來,對於sleep/1狀態的文檔:

阻止當前線程Time秒。

但是,在這種情況下,問題可能不相關的時間,但對於呼叫sleep/1阻斷的正在本身執行time_out/3調用當前線程。儘管如此,我還是試着用其他目標來判斷謂詞,並且也不能得到預期的時間。因此,它可能有一些錯誤。

+0

你知道是否有解決方法嗎? – S0rin

+1

我讓YAP開發者意識到這個線程。我建議你直接與他聯繫,或者發郵件到YAP郵件列表。 –

3

(不知怎的,我錯過了這個線程)

首先,sleep/1time_out/3不要扎堆。 time_out/3等待一定數量的毫秒CPU時間或線程時間,而sleep/1睡眠實時秒。 YAP與original in SICStus相比有一定的侷限性,請參閱手冊瞭解更多信息。

在git的當前開發版本中(last commit d5ce9a137668fe1ae34e2d47c91fc2725ae04a5f, Date:Wed Apr 22 14:21:20 2015-06600),該機制似乎被打破。

在舊版本的6.3.4,我得到:

YAP 6.3.4 (x86_64-linux): Tue Jan 29 12:39:29 CET 2013 
MYDDAS version MYDDAS-0.9.1 
?- use_module(library(timeout)). 
% reconsulting /opt/gupu/share/Yap/timeout.yap... 
    % reconsulting /opt/gupu/share/Yap/hacks.yap... 
    % reconsulted /opt/gupu/share/Yap/hacks.yap in module yap_hacks, 0 msec 15472 bytes 
% reconsulted /opt/gupu/share/Yap/timeout.yap in module timeout, 0 msec 48240 bytes 
true. 
?- 100000000=J,time(time_out((between(1,J,N),N=J),1,R)). 
% 0.008 CPU in 0.007 seconds (114% CPU) 
J = 100000000, 
R = time_out. 
?- 100000000=J,time(time_out((between(1,J,N),N=J),10000,R)). 
% 9.985 CPU in 10.003 seconds (99% CPU) 
J = 100000000, 
R = time_out. 
?- 100000000=J,time(time_out((between(1,J,N),N=J),100000,R)). 
% 23.477 CPU in 23.522 seconds (99% CPU) 
J = N = 100000000, 
R = success. 
?- 100000000=J,time(time_out(sleep(10),1,R)). 
% 0.000 CPU in 10.000 seconds (Inf% CPU) 
J = 100000000, 
R = success.