我试图做一个代码,以的顺序生成集合的所有子集。 也就是说,调用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