我試圖做一個代碼,以的順序生成集合的所有子集。 也就是說,調用subset([1,2,3], X)
應該產生長度有序的子集?
X = [];
X = [1];
X = [2];
X = [3];
X = [1,2];
X = [1,3];
X = [2,3];
X = [1,2,3].
內部順序並不那麼重要,只有最小的子集列第一(即我不在乎[2,3] [1日前來,2],只有1,[2]和[3]在[2,3]之前)。
-
到目前爲止,我已經嘗試了兩種方法。首先,我試着自己做出這個謂詞......
subset([], []).
subset(List, []).
subset(List, [N]) :-
member(N, List).
subset(List, [N|Rest]) :-
!,
nth0(I, List, N),
findall(E, (nth0(J, List, E), J > I), NewList),
subset2(NewList, Rest).
......但它甚至沒有達到預期的效果。其次,我嘗試製作powerset(使用this subset predicate)並使用list_to_ord_set/2進行排序,但是我也無法使其工作。
幫助?
如果您使用'assign([],[])。'而不是第一個規則,您不需要剪切?如果你想擺脫由於某種原因輸出'false'的最後評估,你可以交換第二個和第三個'assign'規則的順序。它改變了順序,但根據OP的要求仍然有效。 – Fatalize
@Fatalize:剪切需要避免重複的解決方案,而anon var接受Xs – CapelliC
的子列表我不明白。我獲得了與這些更改完全相同的結果。小心提供一個需要剪切和匿名變量的例子嗎? – Fatalize