给定自然数的列表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
应该是一个本地谓词。
答案 0 :(得分: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 = []