给定一个自然数L
列表,我需要创建一个包含L
所有子集元素之和的列表。例如,如果L=[1,3,6]
我想获取列表[0,1,3,4,6,7,9,10]
.
我尝试使用此代码
subsetSums(List,Sums) :- findall(Sum,(subset(Sub,List),sum_list(Sub,Sum)),Sums).
但是通过以下查询,我得到[0]
作为唯一的结果,而不是[0,1,2,3]
?- subsetSums([1,2],Sums).
我错在哪里?
编辑:我正在研究SWI Prolog,subset/2
应该是一个原生谓词。
如注释中所建议的,您必须编写自己的subset/2
谓词,然后在此谓词上使用findall/3
,如下所示:
subset([], []).
subset([E|T], [E|T1]):-
subset(T, T1).
subset([_|T], L):-
subset(T, L).
subsetSums(List,Sums) :-
findall(S,(subset(List,Sub),sumlist(Sub,S)),Sums).
?- subsetSums([1,2],L).
L = [3, 1, 2, 0]
?- subsetSums([1,2,3],L).
L = [6, 3, 4, 1, 5, 2, 3, 0]
其中subset/2
的输出为:
subset([1,2,3],L).
L = [1, 2, 3]
L = [1, 2]
L = [1, 3]
L = [1]
L = [2, 3]
L = [2]
L = [3]
L = []