下面是prolog代码(我有点理解它)。
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会遍历这些“树”,但我很难弄清楚为什么只在变量退出时才对它进行递增--有什么机制可以解释吗?
非常感谢!
发布于 2009-11-19 20:45:15
这样做的原因是,N is X+1是谓词的最后一部分。
可以这样想:要计算N is X+1,我们需要知道X的值,它是通过调用len(T,X)来计算的。但是,计算X的过程需要再次调用len,直到最终得到一个空列表。
在这一点上,列表长度是已知的,即0。因此,该值被“返回”。只有0+1才能计算和“返回”。然后是1 +1,等等。
换一种方式考虑,观察到对于任何两个谓词a和b,当a和b都为真时,a, b产生真。在Prolog中,只有在知道b为真的情况下才会计算a (否则计算b就没有意义了,因为已知结果为假)。
因此,所有的添加都是在对len的递归调用之后完成的。
https://stackoverflow.com/questions/1763021
复制相似问题