动态检查成员资格 swi-prolog

dynamically check membership swi-prolog

给定一个自然数列表List我想检查每个子集的元素之和是否不同。最初我使用这个代码

distinctSubsetSums(List,Sums) :- findall(Sum,(subset(Sub,List),sum_list(Sub,Sum)),Sums), all_distinct(Sums).

但我认为存在更好的解决方案,因为使用我的代码我找到了所有可能子集的所有总和,然后我检查它们是否不同。我认为有一种方法可以动态检查是否已经计算了总和然后 return false 而无需搜索所有子集。

谁能帮帮我?

subset_sums(List,Sums) :-
  sum_subset(List,[],[],Sums).

sum_subset([I|Is],Js,Sums0,Sums) :-
  sum_subset(Is,Js,Sums0,Sums1),
  sum_subset(Is,[I|Js],Sums1,Sums).
sum_subset([],Js,Sums0,Sums) :-
  sum_list(Js,Sum),
  \+ member(Sum,Sums0),
  Sums = [Sum|Sums0].