Recursion Prolog sum谓词,temp变量何时实例化?

Recursion Prolog sum谓词,temp变量何时实例化?,recursion,prolog,sum,Recursion,Prolog,Sum,我试图理解这个求和谓词 sum([], 0). sum([H|T], Sum) :- sum(T, Temp), Sum is Temp + H. 它工作,但我不明白为什么。根据我对sum([1,2,3],sum)这样的查询的理解,它将匹配第二个子句,将H实例化为1,T实例化为[2,3],sum仍然是sum。然后,它将尝试再次满足调用sum的第一个子目标,但在第二个目标中,sum是Temp+H,Temp是否给定了一个值 Temp在基本情况下首先给出一个值,sum([],0

我试图理解这个求和谓词

 sum([], 0).
 sum([H|T], Sum) :-
    sum(T, Temp), 
    Sum is Temp + H.

它工作,但我不明白为什么。根据我对sum([1,2,3],sum)这样的查询的理解,它将匹配第二个子句,将H实例化为1,T实例化为[2,3],sum仍然是sum。然后,它将尝试再次满足调用sum的第一个子目标,但在第二个目标中,sum是Temp+H,Temp是否给定了一个值

Temp
在基本情况下首先给出一个值,
sum([],0)
。这会在上面的递归调用中导致
Temp=0
。上面的调用添加了
H
以给出
0+H
,等等

要使自己相信这一点,请跟踪查询的执行情况:

?- trace.
true.

[trace]  ?- sum([1,2,3], Sum).
   Call: (6) sum([1, 2, 3], _G376) ? creep
   Call: (7) sum([2, 3], _G455) ? creep
   Call: (8) sum([3], _G455) ? creep
   Call: (9) sum([], _G455) ? creep
   Exit: (9) sum([], 0) ? creep
^  Call: (9) _G460 is 0+3 ? creep
^  Exit: (9) 3 is 0+3 ? creep
   Exit: (8) sum([3], 3) ? creep
^  Call: (8) _G463 is 3+2 ? creep
^  Exit: (8) 5 is 3+2 ? creep
   Exit: (7) sum([2, 3], 5) ? creep
^  Call: (7) _G376 is 5+1 ? creep
^  Exit: (7) 6 is 5+1 ? creep
   Exit: (6) sum([1, 2, 3], 6) ? creep
Sum = 6.

(爬行的
是我在按Enter键;这是SWI Prolog。)

啊,好吧,我忘了使用跟踪欢呼,我想这会导致每次将Temp设置为0,但我猜,因为Temp不是0,它会导致第一个谓词失败?只有当
T
[]时,第一个谓词才会成功
@Barmar:你是说第一个子句,只有一个谓词。