【发布时间】:2009-11-19 12:39:51
【问题描述】:
这是序言代码(我有点遵循)。
len([],0).
len([_|T],N) :- len(T,X), N is X+1.
这是它的踪迹(我正在运行 linux,swi)
[trace] ?- len([d,f,w,c],X).
Call: (7) len([d, f, w, c], _G314) ?
Call: (8) len([f, w, c], _L182) ?
Call: (9) len([w, c], _L201) ?
Call: (10) len([c], _L220) ?
Call: (11) len([], _L239) ?
Exit: (11) len([], 0) ?
^ Call: (11) _L220 is 0+1 ?
^ Exit: (11) 1 is 0+1 ?
Exit: (10) len([c], 1) ?
^ Call: (10) _L201 is 1+1 ?
^ Exit: (10) 2 is 1+1 ?
Exit: (9) len([w, c], 2) ?
^ Call: (9) _L182 is 2+1 ?
^ Exit: (9) 3 is 2+1 ?
Exit: (8) len([f, w, c], 3) ?
^ Call: (8) _G314 is 3+1 ?
^ Exit: (8) 4 is 3+1 ?
Exit: (7) len([d, f, w, c], 4) ?
X = 4.
我知道 prolog 会沿着这些“树”运行,但我无法弄清楚为什么仅在变量退出时才对变量进行增量 - 对此机制有何解释?
非常感谢!
【问题讨论】:
-
你可以试试
gtrace。您可能必须安装xpce,并且在某些机器上,它会中断咨询,所以当您在trace中时不要加载您的文件。