%% %% Ejemplo de uso: %% ?- maxsum([-5,3,-2,3,-3,-4,-1], Result). %% Result = 4 %% Yes %% % % Obtiene el mayor número de una lista % max(List, Max) :- List = [Head|_], privatemax(List, Head, Max). privatemax([Head|Tail], Max, Result) :- Head > Max, privatemax(Tail, Head, Result). privatemax([Head|Tail], Max, Result) :- Head =< Max, privatemax(Tail, Max, Result). privatemax([],Max,Max). % % Obtiene lista con posibles sumas % sums([], 0, []). sums([Head|Tail], Sum, [Sum|Sums]) :- sums(Tail, TailSum, Sums), TailSum =< 0, Sum is Head, Sum >= 0. sums([Head|Tail], Sum, [Sum|Sums]) :- sums(Tail, TailSum, Sums), TailSum > 0, Sum is Head + TailSum, Sum >= 0. sums([Head|Tail], 0, [0|Sums]) :- sums(Tail, TailSum, Sums), Head + TailSum < 0. % % Elige la mayor de las posibles sumas. Si MaxSum es 0 todos % los números son negativos, en ese caso se elige el mayor de % la lista. % maxsum(List, Result) :- sums(List, _, Sums), max(Sums, MaxSum), (MaxSum > 0 -> Result = MaxSum; max(List, Result)).