2012-04-25 75 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). 

它建立與所述頭的列表,然後選擇來自具有從頭部的每個項目的輸入列表項。如果您取消註釋,評論的剪輯會阻止組合。

相關問題