【问题标题】:Prolog findall solutions within time limitProlog 在时限内找到所有解决方案
【发布时间】:2021-12-27 19:43:51
【问题描述】:

我想在某个时限内找到一个目标的所有解决方案。我的意思是我最多要搜索时限的解决方案,并返回所有找到的解决方案,无论是否达到时限,无论解决方案列表是否完整。

我尝试了以下方法:

catch(call_with_time_limit(60, findall(S,my_goal(S),Sol)), time_limit_exceeded,false)

但是,如果到了时间限制,它不会返回找到的部分解决方案列表,并且“false”不能是依赖于 Sol 的表达式。

这个问题与Prolog: "findall" for limited number of solutions 有关,但我对最长搜索时间感兴趣,而不是最大数量的解决方案。

请问您对此有何见解?

【问题讨论】:

标签: prolog swi-prolog prolog-findall


【解决方案1】:

这样的事情可能对你有用:

findall_time(Duration, Template, Goal, Bag):-
  get_time(TimeStamp),
  Time is TimeStamp + Duration,
  findall(Template, findall_time1(Time, Goal), Bag).
  
findall_time1(Time, Goal) :-
    catch(setup_call_cleanup(alarm_at(Time,
                                      throw(time_limit_exceeded),
                                      Id),
                             (get_time(TimeStamp), Time>TimeStamp, Goal),
                             remove_alarm(Id)),
          time_limit_exceeded,
          fail).

使用此示例代码和测试:

my_goal(X):-
 between(0, 5, X),
 sleep(1).
 

?- findall_time(2.5, X, my_goal(X), Bag).
Bag = [0, 1].

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多