YAP PROLOG超时问题

时间:2015-10-06 09:28:27

标签: prolog yap

有人可以解释为什么以下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).

根据documentation,谓词的工作原理如下:

  

time_out(+Goal, +Timeout, -Result)

     

执行目标Goal,时间有限   Timeout,其中Timeout以毫秒为单位。如果目标   成功,将Resultsuccess统一起来。如果计时器在之前到期   目标终止,将Resulttime_out统一起来。

2 个答案:

答案 0 :(得分:3)

YAP的文件还指出:

  

最后,即使计时器设置为毫秒,也是当前的   实施依赖alarm/3,因此只能提供   秒的精确度。

反过来,sleep/1的文档指出:

  

阻止当前线程Time秒。

但是这种情况下的问题可能与时间无关,而是调用sleep/1阻止当前执行time_out/3调用的线程。尽管如此,我尝试了time_out/3谓词与其他目标,也无法获得预期的时间。因此,可能存在一些错误。

答案 1 :(得分:3)

(不知怎的,我错过了这个帖子)

首先,sleep/1time_out/3不会聚集在一起。 time_out/3等待一定量的毫秒CPU时间或线程时间,而sleep/1则等待实时秒。与original in SICStus相比,YAP存在某些限制,请参阅手册了解更多信息。

在git的当前开发版本中(最后一次提交d5ce9a137668fe1ae34e2d47c91fc2725ae04a5f, 日期:2015年4月22日星期三14:21:20,机制似乎已经破裂。

在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.