【发布时间】:2017-09-14 10:58:42
【问题描述】:
我最近开始学习 prolog,但我在递归规则方面遇到了困难。我理解简单的规则,但是我发现这个例子有问题,我发现一个程序给出了列表中所有元素的总和:
addup([], 0).
addup([FirstNumber | RestOfList], Total) :-
addup(RestOfList, TotalOfRest),
Total is FirstNumber + TotalOfRest.
现在如果我跟踪这个,我会得到以下信息:
[trace] ?- addup([3, 5, 7], Total).
Call: (7) addup([3, 5, 7], _G322)
Call: (8) addup([5, 7], _L1)
Call: (9) addup([7], _L2)
Call: (10) addup([], _L3)
Exit: (10) addup([], 0) % I understand what it does till here
^ Call: (10) _L2 is 7+0
^ Exit: (10) 7 is 7+0
Exit: (9) addup([7], 7)
^ Call: (9) _L1 is 5+7
^ Exit: (9) 12 is 5+7
Exit: (8) addup([5, 7], 12)
^ Call: (8) _G322 is 3+12
^ Exit: (8) 15 is 3+12
Exit: (7) addup([3, 5, 7], 15)
Total = 15.
我了解前几个步骤;它不断削减并制作新的 TotalOfRest,直到原始列表为空并且与第一个事实相匹配。这使得第三个 TotalOfRest(我称之为 _L3)等于 0。 但是现在呢? prolog如何使L2等于7 + 0的步骤。我知道prolog开始回溯,但是什么与得出该结论的内容相匹配?道达尔现在是 7 吗?还是像 TotalOfRest 一样,是否存在具有不同值的三个不同 Total? RestofList 是否仍等于 [] 且 FirstNumber 仍为 7?
所以基本上:prolog 如何从找到 L3 到最终结论?
我对此很陌生,所以如果有人能慢慢地为我解释一下,我将不胜感激!
【问题讨论】: