【问题标题】:I have a List of lists containing 4170 elements and I want to divide them to 139 lists each containing 30 different elements?我有一个包含 4170 个元素的列表列表,我想将它们分成 139 个列表,每个列表包含 30 个不同的元素?
【发布时间】:2014-02-03 06:55:58
【问题描述】:
 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) 等,这是最重要的因素。我希望作为填充计划谓词列表的一种可能解决方案由从像这样[[1,...],[2,...],[3,...] etc till 30 的第一个大列表中提取的 30 个元素组成,谓词的下一个解决方案应该包含另一个列表列表,其中包含 30 个元素,但每个元素都与选择的前 30 个元素不同,依此类推,直到我们没有更多元素要从原始的 4170 个元素中选择

【问题讨论】:

    标签: list recursion prolog


    【解决方案1】:
    1. 创建一个谓词,只过滤那些以指定数字开头的列表
    2. 使用该谓词创建 30 个列表,每个列表的成员都以相同的元素 (1..30) 开头
    3. fillSchedule 然后可以通过从这 30 个列表中的每一个中提取来创建其解决方案:基本情况将采用所有头,递归将获得所有 30 个尾进行处理。一旦 30 个子列表中的一个用完,fillSchedule 就会失败。

    【讨论】:

    • 第 2 步中的小问题我应该使用 findall 来获取 30 个列表吗?然后在步骤 3 中使用结果列表?
    • 您可以使用 findall 来实现步骤 1 中描述的谓词,调用它 30 次以生成 30 个列表,然后将它们传递给 fillSchedule。
    【解决方案2】:

    这是另一种方法:

    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).
    

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

    【讨论】:

      猜你喜欢
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多