首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >N个自然数之和的Prolog递推

N个自然数之和的Prolog递推
EN

Stack Overflow用户
提问于 2018-04-09 17:06:15
回答 1查看 658关注 0票数 0

我很难理解Z的价值是如何不断变化的。特定步骤已在堆栈跟踪输出中指示。

这是我用来求N个自然数和的代码-

代码语言:javascript
复制
sum1(1,1).
sum1(N, Sum) :-
   Next is N-1,
   sum1(Next, Z),
   Sum is Z + N.

这是堆栈跟踪-

代码语言:javascript
复制
?- sum1(3,_).
   Call: (8) sum1(3, _2668) ? creep
   Call: (9) _2860 is 3+ -1 ? creep
   Exit: (9) 2 is 3+ -1 ? creep
   Call: (9) sum1(2, _2862) ? creep
   Call: (10) _2866 is 2+ -1 ? creep
   Exit: (10) 1 is 2+ -1 ? creep
   Call: (10) sum1(1, _2868) ? creep
   Exit: (10) sum1(1, 1) ? creep
   Call: (10) _2872 is 1+2 ? creep
   Exit: (10) 3 is 1+2 ? creep
   Exit: (9) sum1(2, 3) ? creep **%How is Z assigned value 3 ?**
   Call: (9) _2668 is 3+3 ? creep
    Exit: (9) 6 is 3+3 ? EOF: exit

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-09 17:15:25

这不是“改变”;sum1的每一个证明都有自己的NSumNextZ版本。这就是为什么在堆栈跟踪中,每个人都得到一个不同的生成名称(即_2860),因此Prolog可以区分它们。

至于你的具体问题,比你问的线高出2行,那个特定的Sum_2872;所以证明_2872 is 1+2需要_2872为3。这个Sum与之前的call sum(1, _2868)相匹配,其中_2868sum1Z (从上面的2行可以看出)。

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

https://stackoverflow.com/questions/49738123

复制
相关文章

相似问题

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