有人可以解释为什么以下YAP代码不会导致变量Result
与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
统一起来。如果计时器在之前到期 目标终止,将Result
与time_out
统一起来。
答案 0 :(得分:3)
YAP的文件还指出:
最后,即使计时器设置为毫秒,也是当前的 实施依赖
alarm/3
,因此只能提供 秒的精确度。
反过来,sleep/1
的文档指出:
阻止当前线程
Time
秒。
但是这种情况下的问题可能与时间无关,而是调用sleep/1
阻止当前执行time_out/3
调用的线程。尽管如此,我尝试了time_out/3
谓词与其他目标,也无法获得预期的时间。因此,可能存在一些错误。
答案 1 :(得分:3)
(不知怎的,我错过了这个帖子)
首先,sleep/1
和time_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.