我有一个包含4170个元素的列表列表,我想将它们分成139个列表,每个列表包含30个不同的元素?

时间:2012-04-25 19:30:47

标签: list recursion prolog

 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元素中选择的元素

2 个答案:

答案 0 :(得分:1)

  1. 创建一个谓词,仅过滤掉以指定数字开头的列表
  2. 使用该谓词制作30个列表,每个列表的所有成员都以相同的元素开头(1..30)
  3. fillSchedule然后可以通过从这30个列表中的每个列表中绘制来创建其解决方案:基本案例将占用所有头部,递归将被给予所有30个尾部进行处理。一旦打开30个子列表,fillSchedule就会失败。

答案 1 :(得分: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).

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