Prolog代码输出False而不是Variable值

问题描述 投票:1回答:1

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

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

list recursion prolog
1个回答
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.
© www.soinside.com 2019 - 2024. All rights reserved.