2011-11-09 36 views

回答

2

当你写Sum+1你构造什么是仿函数'+'/2和参数Sum1的术语。

在Prolog中,当您要计算总和时,您需要使用谓词is/2

在你的代码,你也应该增加削减消除不必要的choicepoints,并添加X的总和的休息,不1

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

使用蓄能器将允许您使代码tail-递归...

+0

我用你的方法得到了虚假的回报。谢谢 – user236501

+0

我忘了第三项中的'Sum'参数。感谢您通知我。我编辑了答案。 – twinterer

3

在序言中,当您要评估算术表达式时,必须使用is运算符。由于您在计算范围外使用+符号,因此不会专门进行解释。这似乎是家庭作业,所以我给一个简化的例子:

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

上面的代码添加AB并将结果存储在C

+0

奇数([],0]。 奇数([Z],Z)。 ([X,Y | T],Sum): - Sum1是Sum + X,odd(T,Sum1)。这是正确的,但我得到错误将运行程序。 – user236501

0

获取与奇数元素列表,然后总结该列表:

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). 
0
sum([],0). 
sum([H|T],N) :- 
     sum(T,M), N is H + M.