子集和列表 Prolog



给定一个自然数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 = []

最新更新