2010-01-21 232 views
1

我需要執行以下操作:給定一個列表列表,我需要找到列表的所有可能組合,這樣如果這些列表中的某些屬於這樣的組合,那麼它們就沒有共同的元素和通過在組合中追加列表而創建的列表具有給定的長度。有任何想法嗎?從列表中創建一個列表

實施例:

Say P= [[1,2,3],[4,5,6],[2,5],[7,9],[7,10],[8],[10]]. 

N A給定數量,說N = 10。我需要通過P搜索以找到合適的列表,並且沒有共同的元素,並將它們添加到列表L中,使得L的並集長度爲10.因此,在上面的示例中:

L=[[1,2,3],[4,5,6],[7,9],[8],[10]].它可能很簡單,但我是Prolog的新手

+0

你能舉個例子嗎?這可能會讓你的問題更清楚。 – 2010-01-21 09:04:02

+0

非常清晰。 – rvirding 2010-01-21 11:08:59

+0

爲什麼我要評論這樣一箇舊線程?對於Prolog來說,必須非常感興趣。 :-)聽起來像他要求的P的一個子集,其中包含N個獨特(子)元素(而不是其他人);否則是錯誤的。 – azhrei 2012-07-19 06:40:40

回答

0

鑑於沒有人回答,而且自從我在Prolog中編寫任何內容之後已經有一段時間了,我想我需要練習,下面介紹如何做。

首先,爲了更容易地生成組合,我們創建一個術語來預處理列表,以便將它們與其長度配對,以避免必須多次獲取長度。切割避免了不必要的回溯:

with_lengths([], []) :- !. 
with_lengths([H|T1], [(Len, H)|T2]) :- 
    length(H, Len), 
    with_lengths(T1, T2). 

這裏的comb/3謂詞,您可以用產生的組合:

comb(L, R, Max) :- 
    with_lengths(L, L1), 
    comb1(L1, R, Max). 

comb1/3做實際的工作。評論解釋發生了什麼:

% Combination works. 
comb1([], [], 0). 
% Try combining the current element with the remainder. 
comb1([(Len, Elem)|T1], [Elem|T2], Max) :- 
    NewMax is Max - Len, 
    comb1(T1, T2, NewMax). 
% Alternatively, ignore the current element and try 
% combinations with the remainder. 
comb1([_|T1], T2, Max) :- 
    comb1(T1, T2, Max).