我试图理解这个和谓词
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.
(creep
是我按输入;)