YAP PROLOG超时问题



谁能解释一下为什么下面的YAP代码没有导致变量Resulttime_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).

根据文档,谓词应该这样工作:

time_out(+Goal, +Timeout, -Result)

限时执行目标GoalTimeout,其中Timeout以毫秒为单位。如果目标是成功,统一Resultsuccess。如果定时器在目标终止,统一Resulttime_out

YAP的文档还声明:

最后,即使定时器以毫秒为单位设置,当前实现依赖于alarm/3,因此只能提供精度以秒为单位

反过来,sleep/1的文档声明:

阻塞当前线程Time秒。

但是在这种情况下,问题可能与时间无关,而是与sleep/1调用阻塞当前线程有关,而time_out/3调用本身正在执行。然而,我尝试了time_out/3谓词与其他目标,也不能得到预期的超时。因此,它可能有一些错误。

(不知为什么我错过了这个线程)

首先,sleep/1time_out/3不会聚集在一起。time_out/3等待一定毫秒的cpu时间或线程时间,而sleep/1休眠实时秒。与SICStus中的原始版本相比,YAP有一定的限制,更多信息请参阅手册。

在git的当前开发版本中(最后提交d5ce9a137668fe1ae34e2d47c91fc2725ae04a5f)日期:星期三4月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.

相关内容

  • 没有找到相关文章

最新更新