クラスでは、先生が次のように与えたsubset_of/2述語について調べました。
subset_of([],[]).
subset_of([X|Xs],Zs):-subset_of(Xs,Ys),maybe_add(X,Ys,Zs).
maybe_add(_,Ys,Ys).
maybe_add(X,Ys,[X|Ys]).
subsets_of(Xs,Xss):-findall(Ys,subset_of(Xs,Ys),Xss).
それから、ある長さ K のサブセットのみを与えるように変更するように依頼されました (ただし、再帰的な定義を直接見つけることにより、長さ/2 を使用することはできません)。私の最初の試みは、subset_of 呼び出しを余分な要素を追加するものと追加しないもの (maybe_add 呼び出しの代わりに) に分割し、渡されたリストの長さを追跡して最後にチェックすることでしたが、これはまったく計画どおりに機能しませんでした。
subset_of(K, 0, [],[]).
subset_of(K, Len, [X|Xs],Zs):-
L1 is Len - 1,
subset_of(K, L1, Xs, Zs),
L1 == K.
subset_of(K, Len, [X|Xs],Zs):-
L1 is Len - 1,
subset_of(K, L1, Xs,Ys),
do_add(X, Ys, Zs),
Len == K.
subsets_of(K,Xs,Xss):-
length(Xs, Len),
findall(Ys,subset_of(K, Len, Xs,Ys),Xss).
これを解決するための正しいコードを求めているわけではありませんが、正しい方向へのプッシュだけを求めているので、それを理解しようとし続けることができます. 宣言型言語を使用するのはこれが初めてで、かなり混乱しています。