【发布时间】:2015-10-23 11:45:24
【问题描述】:
我正在尝试编写一个代码,以按顺序生成集合的所有子集。
也就是说,调用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 进行排序,但我也无法让它工作。
帮助?
【问题讨论】: