1

この合計述語を理解しようとしています

 sum([], 0).
 sum([H|T], Sum) :-
    sum(T, Temp), 
    Sum is Temp + H.

動作しますが、理由がわかりません。私の理解では、sum([1,2,3], Sum) などのクエリは、H を 1 として、T を [2,3] としてインスタンス化する 2 番目の句に一致し、Sum は引き続き Sum です。次に、最初のサブゴールを再度合計で満たそうとしますが、2 番目のゴールでは合計が Temp + H である場合、Temp に値が与えられますか?

4

1 に答える 1

3

Temp基本ケース で最初に値が与えられますsum([],0)。これはTemp=0、上記の再帰呼び出しで発生します。上記の呼び出しは、 Giveなどに追加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 です。)

于 2013-03-13T16:56:56.530 に答える