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:你是说第一个子句,只有一个谓词。