В SWI Prolog, с sum_list/2
и maplist/3
, что простой состав:
sum_vectors(Vectors,Sum):-
maplist(sum_list,Vectors,Sums),
sum_list(... , ...). % fill in the blanks!
Это предполагает, что Vectors
список списков чисел.
Что касается вашего кода - это не tail-recursive. Гораздо лучше написать код, который равен TR, использование стека будет постоянным. Чтобы достичь TR, обычно это означает, что не задерживайте на будущее то, что вы можете сделать сразу. Здесь вы задерживаете добавление Head
, пока не будет найден Sum1
- но это будет намного позже, когда весь остальной список будет потреблен.
Но что у нас есть, что мы можем добавить Head
, прямо сейчас? Ну, мы могли бы получить SumSoFar
и добавить к , что. Тогда эта новая переменная будет служить аккумулятором, его начальное значение - 0
. Преобразование аккумулятора является стандартным способом достижения TR.