约束谓词不以最大值开头

问题描述 投票:0回答:1

我正在尝试匹配某个列表的前Y个元素的总和,1..10范围内的Y以及总和的最大值。我希望第一个匹配为Res = 10,Y = 10,但这只是给出从Y = 1开始并逐渐增加到Y = 10的答案。我在这里想念什么?

get_max(Res,Y):-
        Y in 1..10,
        add_list([1,1,1,1,1,1,1,1,1,1],Y,0,Res),
        labeling([max(Y)],[Y,Res]).

add_list(_,0,Res,Res).
add_list([H|Rest],C,Temp,Final):-
        NewTemp #= H+Temp,
        NewC #= C-1,
        add_list(Rest,NewC,NewTemp,Final).

?- get_max(Res,Y).
Res = Y, Y = 1 ;
Res = Y, Y = 2 ;
Res = Y, Y = 3 ;
Res = Y, Y = 4 ;
Res = Y, Y = 5 ;
Res = Y, Y = 6 ;
Res = Y, Y = 7 ;
Res = Y, Y = 8 ;
Res = Y, Y = 9 ;
Res = Y, Y = 10.
prolog clpfd
1个回答
1
投票
?- add_list([1,1,1,1], Y, 0, Res).
Y = Res, Res = 0 ;
Y = Res, Res = 1 ;
Y = Res, Res = 2 ;
Y = Res, Res = 3 ;
Y = Res, Res = 4.

此目标按此顺序枚举YRes的值。不需要标记,因为可以充分确定这些值。一旦此目标列举了类似的解决方案,以后的标签也不能强制执行其他顺序。

(此外,如果您要做的只是对列表求和,则谓词不需要那么多参数。如果您对它们进行了更好的命名,您可能还会看到这一点。您最好将C命名为[C0 ]。那么您可以消除它。)

© www.soinside.com 2019 - 2024. All rights reserved.