子集和列表Prolog

时间:2018-01-18 19:11:02

标签: prolog sum subset

给定自然数的列表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应该是一个本地谓词。

1 个答案:

答案 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 = []