3

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

我尝试了以下方法:

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 有关,但我对最大搜索时间感兴趣,而不是最大数量的解决方案。

请问您对此有什么见解吗?

4

1 回答 1

2

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

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].
于 2021-12-27T22:21:24.193 回答