Prolog sum谓词,什么时候是临时变量实例化?

时间:2013-03-13 16:54:35

标签: 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是Temp + H,当Temp给定值时?

1 个答案:

答案 0 :(得分:3)

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是我按 Enter ;这是SWI-Prolog。)