2012-04-30 42 views
0

我想在prolog中定義一個函數,它需要形式組合的參數(3,[a,b,c,d],L),結果返回序言 - 寫在給定列表中的k個數字的組合

L=a,b,c 
L=a,b,d 
L=a,c,d 
L=b,c,d 

我實現如下:

combination(K,argList,L):- 
unknown(X,argList,Y), 
Z is select(X,argList), 
length(Z,K), 
L is Z, 
combination(K,Z,L). 

unknown(X,[X|L],L). 
unknown(X,[_|L],R) :- unknown(X,L,R). 

未知謂詞的行爲如下: [在這裏輸入的形象描述] [1]

請幫幫忙!

+0

您使用哪種Prolog? –

+0

SWI - Prolog編輯 – Basmah

回答

0

自帶使用您的unknown/3定義想到的最簡單的解決方法是:

combination(0, _, []) :- 
    !. 
combination(N, L, [V|R]) :- 
    N > 0, 
    NN is N - 1, 
    unknown(V, L, Rem), 
    combination(NN, Rem, R). 

unknown(X,[X|L],L). 
unknown(X,[_|L],R) :- 
    unknown(X,L,R). 

說明:的combination/3的第二句話看起來從列表L,其謂語unknown/3做線性選擇一個元素方式,返回餘數Rem。一旦從列表L中選出的元素數量超過N,就會觸發終止分支的基本情況(combination/3的第一個子句)。請注意,combination/3的定義依賴於unknown/3的非確定性性質,它留下了用於選擇替代列表元素的選擇點。

+0

該解決方案使用回溯?如果沒有,我怎樣才能解決使用回溯? – KFC

相關問題