一个谓词,它将返回列表中的偶数之和:
sumsq_even([], 0).
sumsq_even([FirstNum|RestOfNums], Total) :-
sumsq_even(RestOfNums, TotalRest),
Total is FirstNum + TotalRest :- 0 is FirstNum mod 2, % Add Firstnum if it is even
Total is TotalRest :- 1 is FirstNum mod 2. % Dont add if firstnum is odd
首先我的代码编译了,但是出现语法错误:第4行中的运算符优先级冲突。同样,当我尝试查询时:
sumsq_even([1,3,5,2,-4,6,8,-7], Total).
它返回False而不是Total的值。我在做什么错了?
答案 0 :(得分:2)
代码(第4行和第5行)中:-
的使用不正确。在Prolog中,if A then B else C
被写为( A -> B ; C)
。因此您的代码应为:
sum_even([],S,S).
sum_even([H|T],ST,S):-
( 0 =:= H mod 2 ->
SO is ST+H;
SO = ST
),
sum_even(T,SO,S).
sumsq_even(L,Total):-
sum_even(L,0,Total).
?- sumsq_even([1,3,5,2,-4,6,8,-7], Total).
Total = 12.