Пролог сумма всех чисел в списке. - PullRequest
0 голосов
/ 09 ноября 2011

Как суммировать все нечетные элементы в списке

пример [1,2,3,4,5,6,7,8,9] = 25

odd([],0].
odd([Z],Z).
odd([X,Y|T], Sum+1):- odd(T,Sum).

но это возвращает мне 1 + 3 + 5 + 7 + 9.

Ответы [ 4 ]

3 голосов
/ 09 ноября 2011

В прологе вы должны использовать оператор is, если вы хотите вычислять арифметические выражения.Поскольку вы используете символ + вне арифметической области видимости, он специально не интерпретируется.Похоже, это домашняя работа, поэтому я приведу упрощенный пример:

add(A, B, C) :- C is A + B.

Приведенный выше код добавляет A и B и сохраняет результат в C.

2 голосов
/ 09 ноября 2011

То, что вы создаете, когда пишете Sum+1 - это термин с функтором '+'/2 и аргументами Sum и 1.

В Прологе, когда вы хотите вычислить сумму, вам нужно использовать предикат is/2.

В вашем коде вы также должны добавить сокращения, чтобы удалить ненужные точки выбора, и добавить X к остальной сумме, а не 1:

odd([],0) :- !.
odd([Z],Z) :- !.
odd([X,_|T],Sum):- odd(T,Sum0), Sum is Sum0+X.

Использование аккумулятора позволит сделать код рекурсивным ...

0 голосов
/ 28 мая 2012
sum([],0).
sum([H|T],N) :-
       sum(T,M), N is H + M.
0 голосов
/ 11 ноября 2011

Получить список с нечетными элементами, а затем сложить этот список:

divide([], [], []).
divide([H|T], [H|L1], L2) :- divide(T, L2, L1).

sum(L, Sum) :- sum(L, 0, Sum).

sum([], Acu, Acu).
sum([H|T], Acu, Acu1) :-
  Acu2 is Acu + H,
  sum(T, Acu2, Acu1).

sum_odd(L, Sum) :-
  divide(L, Odds, _),
  sum(Odds, Sum).

:- sum_odd([1,2,5,6,8,9,1], Sum), writeln(Sum).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...