Logic 序言-为什么会有这种奇怪的痕迹

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。等等

下面是prolog代码(我有点遵循)

这是它的跟踪(我运行linux,swi)

我知道prolog会沿着这些“树”运行,但我很难弄清楚为什么变量的增量只有在退出时才会执行——有没有解释过这种机制


非常感谢

原因是
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.