从prolog中的枚举事实创建列表

从prolog中的枚举事实创建列表,prolog,Prolog,问题是:我们在做学校考试。给定所需的特定时间和时间点,创建一个可能的问题组合列表,以实现时间窗口中的时间点 我一直在摸索Q,无法获得Q选项列表。我知道这个错了,但我找不到正确的组合 事实的格式为(项目编号、分数、解决问题的时间,以分钟为单位) 测试(1,1.5,22)。 测试(2,3.0,17)。 测试(3,1.5,13)。 测试(4,0.5,12)。 测试(5,0.5,11)。 测试(6,1.5,16)。 测试(7,0.5,10)。 测试(8,1,21)。 设置(Q,0,0):-!。 设置(Q

问题是:我们在做学校考试。给定所需的特定时间和时间点,创建一个可能的问题组合列表,以实现时间窗口中的时间点

我一直在摸索Q,无法获得Q选项列表。我知道这个错了,但我找不到正确的组合

事实的格式为(项目编号、分数、解决问题的时间,以分钟为单位)

测试(1,1.5,22)。
测试(2,3.0,17)。
测试(3,1.5,13)。
测试(4,0.5,12)。
测试(5,0.5,11)。
测试(6,1.5,16)。
测试(7,0.5,10)。
测试(8,1,21)。
设置(Q,0,0):-!。
设置(Q、点、时间):-
积分>0,
时间>0,
测试(Q,P,T),
P1是P点,
T1是T时间,
集合([Q],P1,T1)。

您的尝试中存在许多问题,我已在下面的代码中解决了这些问题:

  • 您需要一个测试列表来跟踪您收集的内容(在递归锚点中使用回溯操作符不会阻止解释器在每个步骤中再次选择相同的测试),并需要另一个列表来返回结果。需要一个附加参数。然后,在每个步骤中,
    \+成员(Q,Qs)
    检查是否已选择此测试
  • 要精确匹配点,需要在锚点中使用浮点(
    0.0
  • 下一步中使用的点/时间按错误顺序计算,结果为负值
  • 精确匹配点和时间可能是一个非常严格的要求。我允许使用较少的时间作为一种选择,这样我就可以在不进行太多测试的情况下得到一些结果
set(Qs, 0.0, _, Qs) :- !.
set(Qs, Points, Time, Result) :- 
   Points > 0.0, 
   Time > 0, 
   test(Q,P,T), 
   \+member(Q,Qs),
   T < Time,
   P1 is Points - P, 
   T1 is Time - T, 
   set([Q|Qs],P1,T1, Result).
?- set([],8,120,Res).
Res = [8, 5, 4, 3, 2, 1] ;
Res = [6, 4, 3, 2, 1] ;
Res = [8, 7, 4, 3, 2, 1] ;
Res = [5, 8, 4, 3, 2, 1] ;
...