首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog递归算法

Prolog递归算法
EN

Stack Overflow用户
提问于 2013-04-28 06:01:44
回答 1查看 1.2K关注 0票数 1

我对prolog非常陌生,在理解一些基本的算术时遇到了一些问题。我想创建一个可以递归乘法的函数式。即: 3*4 = 3+3+3+3 = 12。

我把它放在SWIPL的trace命令中,它在递减Count时失败。

这是我到目前为止拥有的代码,但它不能工作。

代码语言:javascript
复制
multn(_,0,0).
multn(_, Count ,Return) :- Count is Count-1,
                           Return is 0, 
                           multn(_,Count,Return), 
                           Return is Return + _.

编辑:根据您所说的"is“的功能做了一些新的更改。

代码语言:javascript
复制
multn(_, Count ,Return) :- Count1 is (Count-1), 
                           multn(_,Count1,Return1), 
                           Return is (Return1 + _).

现在,它一直沿着递归链向下运行到基例,当它重新启动时,尝试todo Return is (Return1+ _)失败。它似乎正在更改_变量。这是我的踪迹:

代码语言:javascript
复制
[trace]  ?- multn(3,2,X).
   Call:  (6) multn(3, 2, _G388) ? creep
^  Call:  (7) _L142 is 2+ -1 ? creep
^  Exit:  (7) 1 is 2+ -1 ? creep
   Call:  (7) multn(_L160, 1, _L143) ? creep
^  Call:  (8) _L163 is 1+ -1 ? creep
^  Exit:  (8) 0 is 1+ -1 ? creep
   Call:  (8) multn(_L181, 0, _L164) ? creep
   Exit:  (8) multn(_L181, 0, 0) ? creep
^  Call:  (8) _L143 is 0+_G461 ? creep
ERROR: is/2: Arguments are not sufficiently instantiated
^  Exception: (8) _L143 is 0+_G461 ? creep
   Exception: (7) multn(_L160, 1, _L143) ? creep
   Exception: (6) multn(3, 2, _G388) ? creep

最后一次编辑:最终弄清楚了,使用_导致了值的奇怪变化。谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2013-04-28 06:42:05

看起来你并不了解Prolog是如何工作的。

要理解的关键是Count is Count-1中的两个Count是相同的,它们必须具有相同的值。这就像代数中的变量-方程式中的所有X表示相同的值。所以Count is Count-1总是会失败。

Return变量也有类似的问题。

在Prolog中,你必须引入新的变量来做你想做的事情,比如NewCount is Count-1

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

https://stackoverflow.com/questions/16257298

复制
相关文章

相似问题

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