gpt4 book ai didi

prolog - 获取集合列表,其中每个集合的总和为 X

转载 作者:行者123 更新时间:2023-12-01 12:54:24 25 4
gpt4 key购买 nike

我想弄清楚如何生成集合列表,其中每个集合的长度为 N,每个集合的总和为 X。

我找到了这段代码:

num_split(0,[]).
num_split(N, [X | List]):-
between(1,N,X),
plus(X,Y,N),
num_split(Y,List).

我可以用它来获得总和为 X 的集合列表:

num_split(6,List),length(List,5).
List = [1, 1, 1, 1, 2] ;
List = [1, 1, 1, 2, 1] ;
List = [1, 1, 2, 1, 1] ;
List = [1, 2, 1, 1, 1] ;
List = [2, 1, 1, 1, 1] ;
false.

问题是这些都是排列,我正在寻找组合。我正在寻找的输出应该类似于 get_combos(Sum,Length,List):

get_combos(6,2,List).
List = [5,1];
List = [4,2];
List = [3,3];
false.

有什么建议吗?

最佳答案

如果您有权访问 CLP(FD)库,您可以使用此代码:

:- [library(clpfd)].

get_combos(Sum, Length, List) :-
length(List, Length),
List ins 1 .. Sum,
% all_distinct(List), not really useful here
sum(List, #=, Sum),
chain(List, #<),
label(List).

测试:

?- get_combos(10,3,L).
L = [1, 2, 7] ;
L = [1, 3, 6] ;
L = [1, 4, 5] ;
L = [2, 3, 5] ;

也许我误解了你的问题。使用这个链

...
chain(List, #=<),
....

获取可能的重复值:

?- get_combos(10,3,L).
L = [1, 1, 8] ;
L = [1, 2, 7] ;
L = [1, 3, 6] ;
L = [1, 4, 5] ;
L = [2, 2, 6] ;
L = [2, 3, 5] ;
L = [2, 4, 4] ;
L = [3, 3, 4] ;
false.

关于prolog - 获取集合列表,其中每个集合的总和为 X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10611585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com