Тайм-аут YAP PROLOG

Может кто-нибудь объяснить, почему следующий код 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).

Согласно документации, предикат должен работать следующим образом:

time_out(+Goal, +Timeout, -Result)

Выполнить цель Goal с ограниченным временем Timeout, где Timeout измеряется в миллисекундах. Если цель достигнута, объединяйтесь Result с success, Если таймер истекает до окончания цели, унифицировать Result с time_out,

2 ответа

(Как-то я пропустил эту ветку)

Первый, sleep/1 а также time_out/3 не собираться вместе time_out/3 ожидает определенное количество миллисекунд процессорного времени или времени потока, тогда как sleep/1 спит в режиме реального времени секунд. В YAP есть определенные ограничения по сравнению с оригиналом в SICStus, подробнее см. В руководстве.

В текущей версии разработки из git (последний коммит d5ce9a137668fe1ae34e2d47c91fc2725ae04a5f, дата: ср 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.

В документации YAP также говорится, что:

Наконец, хотя таймер установлен в миллисекундах, текущая реализация опирается на alarm/3и, следовательно, может предложить только точность в масштабе секунд.

В свою очередь, документация для sleep/1 состояния:

Заблокировать текущий поток для Time секунд.

Но проблема в этом случае, скорее всего, связана не со временем, а с призывом sleep/1 блокирование текущего потока, где time_out/3 сам вызов выполняется. Тем не менее, я попробовал time_out/3 предикат с другими целями, а также не может не получить ожидаемое время ожидания. Таким образом, в этом может быть какая-то ошибка.

Другие вопросы по тегам