2013-02-09 2 views
1

Я пытаюсь подытожить набор векторов в Prolog.Суммирование набора векторов в Prolog

У меня есть код для суммирования элементов в одном векторе, но я не уверен, как его расширить до нескольких векторов.

У меня есть это:

set_addtion([],0). 
set_addtion([Head | Tail], TotalSum) :- 
    set_addtion(Tail, Sum1), 
    TotalSum is Head + Sum1. 

ответ

2

В 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.

1

, если вам нужно обработать вложенных списка - может быть, результат каких-то дерево структурированных вычислений - вы могли бы сделать, используя эти встроенные команды:

sum_lists(Nested, Total) :- 
    flatten(Nested, List), 
    sum_list(List, Total). 
Смежные вопросы