2016-05-16 69 views
1

我想要將這種列表類型列出:[worker1(J, 10), worker2(T, 20), worker3(P, 30)]. ,首先從頭開始,將它與下一個元素結合,並且直到結束,如果在那一刻沒有達成解決方案(我的問題受到工人來訪的順序的影響),那麼我想從另一個工人開始,並探索所有其他選擇。如何以不同方式組合列表中的元素

我不知道是否有一個簡單的方法來做到這一點,但現在是我必須嘗試解決一個練習的唯一想法,所以我想在這裏問。與我所知道的,到目前爲止的問題是,我想和這樣的:

W1-W2,W1-W3,W1-W4

如果失敗了,用遞歸,我會跳過頭,並會有:

W2-W3,W2-W4

但不W2-W1,所以我會錯過可能的解決方案。我沒有找到什麼時,尋找周圍所以我的假設是,我沒有使用正確的術語

回答

2

如果你谷歌「prolog組合的列表」,你會發現Prolog Guide - Combinatorics。這裏有顯示,將產生一個給定的名單LN元素的子列表謂詞的一個微小的變化:

comb(2, List, Comb). 

comb(0, _, []). 
comb(N, [X|T], [X|Comb]) :- 
    N #> 0, 
    N1 #= N - 1, 
    comb(N1, T, Comb). 
comb(N, [_|T], [X|Comb]) :- 
    N #> 0, 
    comb(N, T, [X|Comb]). 

要得到所有你所追求的對,你可以調用這個

例如:

| ?- comb(2, [a,b,c,d], R). 

R = [a,b] ? a 

R = [a,c] 

R = [a,d] 

R = [b,c] 

R = [b,d] 

R = [c,d] 

no 

如果你想衝刺對,你可以只用它們映射:

pair_list_dash([X,Y], X-Y). 
相關問題