2012-04-30 4 views
0

私は、フォームの組み合わせ(3、[a、b、c、d]、L)の引数をとる関数をプロローグで定義しようとしています。Prolog - 与えられたリストに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 - プロローグエディタ – 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の二句が述語unknown/3がリニアでないリストL、から要素を選択するように見えます残りは、Remです。リストLから選択された要素の数がNを超えると、分岐が終了するベースケース(最初の句combination/3)がトリガされます。 combination/3の定義は、代替リスト要素を選択するための選択肢を残すunknown/3の非決定論的性質に依存することに注意してください。

+0

ソリューションはバックトラッキングを使用していますか?そうでない場合は、バックトラッキングを使用してどのように解決できますか? – KFC

関連する問題