0

フォームの引数を取るプロローグで関数を定義しようとしています triple(3,[a,b,c,d],L) 、結果は戻ります

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]

助けてください。

4

1 に答える 1

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).

説明: の 2 番目の節はcombination/3、リスト から要素を選択するように見えますL。述語unknown/3はこれを直線的に行い、残りの を返しRemます。リストから選択された要素の数が をL超えるNと、基本ケースがトリガーされ ( の最初の句combination/3)、分岐が終了します。の定義は、代替リスト要素を選択するための選択ポイントを残す非決定 combination/3論的性質に依存していることに注意してください。unknown/3

于 2012-05-02T06:51:15.343 に答える