Я бы попробовал напрячь рекурсию, то есть, не перебирать все возможные значения в поисках сумм, а пойти в обратном направлении: раскладывать сумму на все возможные значения...
procedure Test is
type arr is array(Positive range <>) of Integer;
max_parts: constant Integer := 5;
procedure divide(s: in Integer; vals: in out arr;
n_parts: in Integer) is
ok: Boolean;
begin
if n_parts = 1 then
ok := True;
-- Так отсекаем дубликаты
for i in 2 .. max_parts - 1 loop
ok := ok and (vals(i - 1) <= vals(i));
end loop;
if ok then
for i in 1 .. max_parts - 1 loop
Put(Integer'Image(vals(i)) & "+");
end loop;
Put_Line(Integer'Image(s));
end if;
else
for i in 1 .. s - 1 loop
vals(max_parts - n_parts + 1) := i;
divide(s - i, vals, n_parts - 1);
end loop;
end if;
end;
v: arr(1 .. max_parts);
begin
New_Line;
divide(12, v, max_parts); -- Ищем все разложения числа 12 на 5 чисел
end Test;
Вроде, работает... Это все при условии, что нет дополнительных ограничений, на использование одинаковых чисел, еще чего-нибудь...
P.S. Sorry за язык, но за Паскалем надо идти в соседнее здание, а так неохота...