Prolog-Redo after failed if语句导致未实例化的变量?

Prolog-Redo after failed if语句导致未实例化的变量?,prolog,Prolog,解决:阅读回答,似乎是一个格式问题。在第4行周围放上括号 我试图使用if->then;在prolog中,else仅对列表中的偶数整数求和。我只是想跳过那些不是偶数的数字。下面是我的代码 sum_even([], 0). sum_even([H|T], Sum):- sum_even(T, Temp), even(H) -> Sum is H + Temp; Sum is Temp. even([]). even(Num):- 0 is Num mod 2. 问题

解决:阅读回答,似乎是一个格式问题。在第4行周围放上括号

我试图使用if->then;在prolog中,else仅对列表中的偶数整数求和。我只是想跳过那些不是偶数的数字。下面是我的代码

sum_even([], 0).
sum_even([H|T], Sum):-
    sum_even(T, Temp),
    even(H) -> Sum is H + Temp; Sum is Temp.

even([]).
even(Num):-
    0 is Num mod 2.

问题是,当偶数(H)失败时,它会在上面的行上调用“重做”(不确定这意味着什么),这会导致Temp未经证实吗?总的来说,Temp失败了,然后整个过程都失败了。有人能解释一下我做错了什么以及如何解决这个问题吗。

if-then-else构造缺少括号。运算符优先级使if部分在代码中为
sum_偶数(T,Temp),偶数(H)
。请尝试:

sum_even([], 0).
sum_even([H|T], Sum):-
    sum_even(T, Temp),
    (even(H) -> Sum is H + Temp; Sum is Temp).