0
 are_different(List1,List2):-
    nth0(0,List1,Slot1),
    nth0(0,List2,Slot2),
    Slot1\==Slot2.


fillSchedule([30,_,_,_,_,_,__],S).

fillSchedule([H|T],[H1|T1]):-
    are_different(H,H1),
    H1 = H,
    fillSchedule(T,T1).

fillSchedule([H|T],L):-
    fillSchedule(T,L).

大 4170 元素列表中的列表采用以下形式

[1,A,B,C,D,E,F],[1,A1,B1,C1,D1,F1].......[5,_,_,_,_,_,_].....[30,_,..]

每个列表都以某种方式与其他列表不同,但不一定是第一个元素 (1)、(2) 等,这是最重要的因素。我希望作为填充计划谓词的一个可能解决方案,一个由 30 个组成的列表像这样从第一个大列表中提取的元素[[1,...],[2,...],[3,...] etc till 30,谓词的下一个解决方案应该包含另一个列表列表,其中包含 30 个元素,但每个列表都与选择的前 30 个元素不同,依此类推,直到我们从原始 4170 个元素中没有更多元素可供选择

4

2 回答 2

1
  1. 创建一个谓词,仅过滤掉那些以指定数字开头的列表
  2. 使用该谓词创建 30 个列表,每个列表的成员都以相同的元素 (1..30) 开头
  3. 然后,fillSchedule 可以通过从这 30 个列表中的每一个中提取来创建其解决方案:基本情况将采用所有头,递归将被赋予所有 30 个尾来处理。一旦 30 个子列表中的一个用完,fillSchedule 就会失败。
于 2012-04-25T19:37:35.413 回答
0

这是另一种方法:

fillSchedule(InL, OutL):-
    numlist(1, 30, Heads),
    fillSchedule(Heads, Heads, InL, [], OutL).

fillSchedule([], _, _, OutL, OutL).
fillSchedule([], Heads, InL, _, OutL):-
  fillSchedule(Heads, Heads, InL, [], OutL).
fillSchedule([Item|TailHeads], Heads, InL, MedL, OutL):-
  select([Item|Rest], InL, NInL),
  % !, This cut would prevent combinations
  fillSchedule(TailHeads, Heads, NInL, [[Item|Rest]|MedL], OutL).

它建立一个带有头部的列表,然后从输入列表中选择具有头部中的每个项目的项目。如果您取消注释,注释剪切会阻止组合。

于 2012-04-26T15:13:02.527 回答