Logic 序言-为什么会有这种奇怪的痕迹
下面是prolog代码(我有点遵循) 这是它的跟踪(我运行linux,swi) 我知道prolog会沿着这些“树”运行,但我很难弄清楚为什么变量的增量只有在退出时才会执行——有没有解释过这种机制Logic 序言-为什么会有这种奇怪的痕迹,logic,prolog,Logic,Prolog,下面是prolog代码(我有点遵循) 这是它的跟踪(我运行linux,swi) 我知道prolog会沿着这些“树”运行,但我很难弄清楚为什么变量的增量只有在退出时才会执行——有没有解释过这种机制 非常感谢 原因是N是X+1是谓词的最后一部分 这样想:要计算N是X+1,我们需要知道X的值,它是通过调用len(T,X)计算的。但是计算X的过程需要再次调用len,一直到最后得到一个空列表的情况 在这一点上,列表长度是已知的,即0。因此,该值被“返回”。只有0+1才能计算并“返回”。然后是1+1。等等
非常感谢 原因是
N是X+1
是谓词的最后一部分
这样想:要计算N是X+1
,我们需要知道X
的值,它是通过调用len(T,X)
计算的。但是计算X
的过程需要再次调用len
,一直到最后得到一个空列表的情况
在这一点上,列表长度是已知的,即0。因此,该值被“返回”。只有0+1才能计算并“返回”。然后是1+1。等等
换一种方式考虑,观察任何两个谓词a
和b
,a、b
在a
和b
都为真时产生真。在Prolog中,b
只有在知道a
为真时才会被计算(否则,计算b
没有意义,因为已知结果为假)
因此,所有添加都是在递归调用
len
之后完成的,不客气!如果有帮助,那么你也可以对答案进行投票(只是说,因为我在你的个人资料中看到你没有在这个网站上投票)。你可以试试gtrace
。您可能必须安装xpce
,在某些机器上,它会中断咨询,因此在trace
中时不要加载文件。
len([],0).
len([_|T],N) :- len(T,X), N is X+1.
[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.