我试图理解这个总和谓词
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
到 give0+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
是我打的Enter;这是 SWI-Prolog。)