2012-04-25 93 views
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元素列表内的列表是以下形式我有一个包含4170个元素的列表列表,我想将它们分成139个列表,每个列表包含30个不同的元素?

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

每个列表是从以某种方式或另一其他列表不同,但不neccasrily所述第一元件(1),(2 )等等,这是最重要的因素。我想要作为一个可能的解决方案填充调度谓词从第一个大列表中提取的30个元素列表,如[[1,...],[2,...],[3,...] etc till 30,谓词的下一个解决方案应该包含另一个包含30元素,但每一个不同于前30选择等等,直到我们没有更多的元素可以选择原来的4170元素

回答

1
  1. 做一个断言,这将过滤出与指定的号码开始
  2. 使用谓词,使30名名单,它的每个成员都与同一个元素的列表(1..30)
  3. fillSchedule然后可以通过从这30个列表中的每一个中绘制来创建它的解决方案:基本案例将全部考虑,递归将被赋予全部30个尾部来处理。一旦30个子列表用完,fillSchedule将会失败。
+0

步骤2中的小问题应该使用findall来获得30个列表吗?然后在步骤3中使用结果列表? – 2012-04-25 19:47:30

+0

您可以使用findall来实现步骤1中描述的谓词,调用它30次以制作30个列表,然后将它们传递给fillSchedule。 – 2012-04-25 20:21:49

+0

非常感谢 – 2012-04-25 21:34:53

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

它建立与所述头的列表,然后选择来自具有从头部的每个项目的输入列表项。如果您取消注释,评论的剪辑会阻止组合。

相关问题