我正在尝试匹配某个列表的前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.
?- 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.
此目标按此顺序枚举Y
和Res
的值。不需要标记,因为可以充分确定这些值。一旦此目标列举了类似的解决方案,以后的标签也不能强制执行其他顺序。
(此外,如果您要做的只是对列表求和,则谓词不需要那么多参数。如果您对它们进行了更好的命名,您可能还会看到这一点。您最好将C
命名为[C0 ]。那么您可以消除它。)