Prolog递归算术

时间:2013-04-27 22:01:44

标签: math recursion prolog

我对prolog很新,并且在理解一些基本算术方面遇到了一些问题。我想创建一个递归乘法的仿函数。 IE:3 * 4 = 3 + 3 + 3 + 3 = 12.

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

这是我到目前为止的代码,但它不起作用。

multn(_,0,0).
multn(_, Count ,Return) :- Count is Count-1,
                           Return is 0, 
                           multn(_,Count,Return), 
                           Return is Return + _.
编辑:根据您对“是”功能的说法做了一些新的更改。

multn(_, Count ,Return) :- Count1 is (Count-1), 
                           multn(_,Count1,Return1), 
                           Return is (Return1 + _).

现在它一直沿着递归链向基本情况发展,当它开始向后恢复时,它失败了试图返回返回(Return1 + _)。它似乎正在改变_变量。这是我的追踪:

[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

最后编辑:最后想出来,使用_导致了奇怪的价值变化。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

看起来你不明白Prolog是如何运作的。

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

Return变量的类似问题。

在Prolog中,您必须引入新的变量来实现您的目标,例如NewCount is Count-1