Prolog代码输出False而不是变量值

时间:2019-03-21 08:24:42

标签: list recursion prolog

一个谓词,它将返回列表中的偶数之和:

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的值。我在做什么错了?

1 个答案:

答案 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.