в классе мы прошли предикат 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 (но не с использованием length / 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).
Я НЕ прошу правильный код, чтобы решить эту проблему, а лишь подталкиваю в правильном направлении, чтобы я мог продолжать пытаться выяснить это. Это мой первый раз с декларативным языком, и я довольно смущен.