3

Result次の YAP コードで変数が と統合されない理由を説明できる人はいますtime_outか?

?- 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します。 はミリ秒単位で測定されます。ゴールが成功したら とResult合体success。ゴールが終了する前にタイマーが切れた場合は、 で合体Resulttime_outます。

4

2 に答える 2

3

(なぜかこのスレ見逃してた)

まず、sleep/1群がらtime_out/3ないこと。 time_out/3CPU時間またはスレッド時間の一定のミリ秒を待機しますが、sleep/1リアルタイムの秒数をスリープします。SICStusのオリジナルと比較して、YAP には特定の制限があります。詳細については、マニュアルを参照してください。

git からの現在の開発バージョン (最後のコミット d5ce9a137668fe1ae34e2d47c91fc2725ae04a5f、日付: Wed Apr 22 14:21:20 2015 -0600) では、メカニズムが壊れているようです。

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.
于 2015-11-08T10:46:07.653 に答える