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_evensum_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(またはターボまたは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. 
関連する問題