首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >prolog -为什么会有这种奇怪的跟踪

prolog -为什么会有这种奇怪的跟踪
EN

Stack Overflow用户
提问于 2009-11-19 20:39:52
回答 1查看 474关注 0票数 2

下面是prolog代码(我有点理解它)。

代码语言:javascript
运行
复制
len([],0).
len([_|T],N) :- len(T,X), N is X+1.

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

代码语言:javascript
运行
复制
    [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会遍历这些“树”,但我很难弄清楚为什么只在变量退出时才对它进行递增--有什么机制可以解释吗?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,等等。

换一种方式考虑,观察到对于任何两个谓词ab,当ab都为真时,a, b产生真。在Prolog中,只有在知道b为真的情况下才会计算a (否则计算b就没有意义了,因为已知结果为假)。

因此,所有的添加都是在对len的递归调用之后完成的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1763021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档