Prolog 在列表中查找所有元素的组合,这些元素的总和为一个值

Prolog 在列表中查找所有元素的组合,这些元素的总和为一个值,prolog,Prolog,假设我有一个随机长度的列表,比如: L = [190, 20, 80, 200, 10]. 有没有办法在输出列表中获得所有可能的元素组合,使它们的总和小于或等于给定值 例如,查找元素(MaxValue、InputList、OutputList) MaxValue=200的可能解决方案: OutputList = [190, 10] OutputList = [200] OuputList = [20, 80, 10] 到目前为止,我的代码如下所示: solutions(_, [], [],

假设我有一个随机长度的列表,比如:

L = [190, 20, 80, 200, 10].
有没有办法在输出列表中获得所有可能的元素组合,使它们的总和小于或等于给定值

例如,查找元素(MaxValue、InputList、OutputList)

MaxValue=200的可能解决方案:

OutputList = [190, 10]
OutputList = [200]
OuputList = [20, 80, 10]
到目前为止,我的代码如下所示:

solutions(_, [], [], _).

solutions(MaxValue, [H|T], OutputList, Acc):-
    Z is H + Acc,
    Z > MaxValue,
    solutions(MaxValue, T, OutputList, Acc), !.

solutions(MaxValue, [H|T], [H|T2], Acc):-
    Z is H + Acc,
    Z =< MaxValue,
    solutions(MaxValue, T, T2, Z).

solutions(MaxValue, Inputlist, OutputList):-
    solutions(MaxValue, Inputlist, OutputList, 0).
但是
X=[3,4180]
也是正确的,而且
X=[180,10]
也是正确的。我想把它们都作为解决方案


提前谢谢

一个快速的实现可以是:

subset([], []).
subset([H|T], [H|T1]):-
  subset(T,T1).
subset([_|T],T1):-
  subset(T, T1).

solve(MaxVal,Lin,Lout):-
    subset(Lin,Lout),
    sumlist(Lout,Val),
    Val < MaxVal.

因此,您只需找到所有子集,然后检查列表的总和是否小于值
MaxVal

是的,这是可能的。到目前为止,您尝试了什么?我尝试使用累加器变量递归遍历列表,该变量从左到右累加元素,但这不是我想要的。如果我使用MaxValue=200,我将得到OutputList=[190]。但也有其他元素组合可以满足这一要求,例如OutputList=[20,80,10]。编辑您的问题,并显示您的编码尝试以及您遇到的问题。我已更新了问题并添加了代码。非常感谢。您可能需要调整它,因为这将为您提供所有组合的所有顺序;)
subset([], []).
subset([H|T], [H|T1]):-
  subset(T,T1).
subset([_|T],T1):-
  subset(T, T1).

solve(MaxVal,Lin,Lout):-
    subset(Lin,Lout),
    sumlist(Lout,Val),
    Val < MaxVal.
?- solve(200,[190, 20, 80, 200, 10],L).
L = [190]
L = [20, 80, 10]
L = [20, 80]
L = [20, 10]
L = [20]
L = [80, 10]
L = [80]
L = [10]
L = []