2016-12-19 3 views
1

Я застрял в этой точке. Невозможно узнать, как суммировать элементы на четных позициях.Элементы списка элементов пролога в четных позициях

domains 
slist=integer* 
pos,sum=integer 
predicates 
even(pos). 
even_summ(slist,pos,sum). 
clauses 
even(X):- X mod 2 = 0. 
even_summ([],0,0). 
even_summ([H|T],P,S):- even_summ(T,P1,S1), 
P=P1+1, 
S=S1+H. 
goal 
even_summ([1,2,3,4,5,6,7],P,S). 

ответ

0

Простой sumEven/2sumOdd/2 приходят бесплатно)

sum1of2([], _, 0). 

sum1of2([H | T], 0, S1) :- 
    sum1of2(T, 1, S0), 
    S1 is S0 + H. 

sum1of2([_ | T], 1, S) :- 
    sum1of2(T, 0, S). 

sumEven(L, S) :- 
    sum1of2(L, 1, S). 

sumOdd(L, S) :- 
    sum1of2(L, 0, S). 
+0

@ max56 Спасибо, чувак! –

2

Вот решение с участием четных и нечетных, который не требует вспомогательной переменной. Он рассматривает sum_even и sum_odd как «со-предикаты».

sum_even([], 0). 
sum_even([_|T], S) :- sum_odd(T, S). 

sum_odd([], 0). 
sum_odd([X|T], S) :- S #= S1 + X, sum_even(T, S1). 

Поскольку вы используете Визуальная (или Turbo или PDC) Пролог, это необходимо будет переписать немного как следующий, который не является хвостовой рекурсией или реляционная:

sum_even([], 0). 
sum_even([_|T], S) :- sum_odd(T, S). 

sum_odd([], 0). 
sum_odd([X|T], S) :- sum_even(T, S1), S = S1 + 1. 

 Смежные вопросы

  • Нет связанных вопросов^_^