1

我试图理解这个总和谓词

 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 值?

4

1 回答 1

3

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。)

于 2013-03-13T16:56:56.530 回答