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

List 我有一个包含4170个元素的列表,我想把它们分成139个列表,每个列表包含30个不同的元素?,list,recursion,prolog,List,Recursion,Prolog,大4170元素列表中的列表如下所示 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). fil

大4170元素列表中的列表如下所示

 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).
每个列表在某种程度上不同于其他列表,但不一定是第一个元素(1),(2)等,这是最重要的因素。我希望作为填充计划谓词的一个可能解决方案,一个列表由从第一个大列表中提取的30个元素组成,如下所示等到30时,谓词的下一个解决方案应该包含另一个列表,其中包含30个元素,但每个元素与前30个元素不同,依此类推,直到我们没有更多的元素可从原始4170个元素中选择

  • 生成一个谓词,该谓词将仅过滤掉以指定数字开头的列表
  • 使用该谓词创建30个列表,每个列表的成员都以相同的元素(1..30)开头
  • 然后,fillSchedule可以从这30个列表中的每一个列表中绘制出它的解决方案:基本用例将占据所有的头部,递归将获得所有的30个尾部进行处理。一旦30个子列表中的一个子列表用完,fillSchedule将失败

  • 以下是另一种方法:

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

    它构建了一个带有标题的列表,然后从输入列表中选择包含标题中每个项目的项目。如果您取消注释,注释的剪切将阻止组合。

    第2步中的小问题我是否应该使用findall获取30个列表?然后在第3步中使用结果列表?您可以使用findall实现中描述的谓词第一步,给它打30次电话,列出你的30个列表,然后把它们传递给fillSchedule。
    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).