我坚持这一点。无法找到如何在偶数位置对元素求和。
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 :(得分: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).
由于您使用的是Visual(或Turbo或PDC)Prolog,因此需要稍微重写一下,这不是尾递归或关系:
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.
答案 1 :(得分:0)
一个简单的sumEven/2
(免费提供sumOdd/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).