Добавление целых чисел в список

По какой-то причине это не работает. Я получаю: ОШИБКА: is/2: Аргументы не достаточно созданы

1 add_list([]).
2 add_list([H|T]):-
3                 Sum2 is Sum1 + H,
4                 add_list(T).

Я пытаюсь добавить содержимое списка (содержащего только цифры).

3 ответа

Решение

Я не уверен, что ты пытаешься сделать. Но если вы пытаетесь подсчитать общую сумму, это будет так (смените имя на list_sum, так как add_list не имеет никакого смысла):

list_sum([], 0).
list_sum([H|T], Sum):-
    list_sum(T, SubSum),
    Sum is SubSum + H.

Вы можете иметь "функциональный ум" с помощью foldl:

foldl(_P, [], V, V).

foldl(P, [H|T], V1, VF) :-
    call(P, H, V1, V2),
    foldl(P, T, V2, VF).


sum_list(L, S) :-
    foldl(add, L, 0, S).


add(X, Y, Z) :-
    Z is X+Y.

В качестве альтернативы вы также можете использовать аккумулятор (преимущество заключается в том, что он хвостовой рекурсии и, следовательно, может быть оптимизирован)

list_sum(L,R) :- list_sum(L,0,R).   
list_sum([],A,A). 
list_sum([H|T],A,R) :- A1 is A + H, list_sum(T,A1,R).
Другие вопросы по тегам