Prolog:2个数字的递归乘法

时间:2017-04-08 19:30:38

标签: prolog successor-arithmetics

我不明白为什么这种乘法的递归定义有效 我得到了添加部分,但" A"的价值如何?在这种背景下。 代码如下:

add(0,X,X).
add(s(X),Y,Z):-add(X,s(Y),Z).

mult(0,X,0).
mult(s(X),Y,Z):-mult(X,Y,A), add(Y,A,Z).

2 个答案:

答案 0 :(得分:2)

要理解谓词,请尝试阅读"他们在说什么。

首先阅读add/3定义......

add(0,X,X).
  

0添加到X会产生X

add(s(X),Y,Z):-add(X,s(Y),Z).
  

s(X)({1}}的后继者)添加到X会导致Y ,如果Z添加到Xs(Y)的继承者)会产生Y

如果我们将后继者视为添加1,那么如果Z导致(X + 1) + Y Z,则表示X + (Y + 1)会产生Z。这在逻辑上是显而易见的,但似乎无处可去。但是,我们注意到这个逻辑与add(0,X,X)的基本情况紧密耦合,因为递归情况将通过在每次迭代中删除单个连续来减少第一个参数,直到第一个参数变为0

现在让我们试试mult/3 ...

mult(0,X,0).
  

0乘以X会产生0

这似乎很明显。

mult(s(X),Y,Z):-mult(X,Y,A), add(Y,A,Z).
  

X的后续版本乘以Y会导致Z 如果X乘以Y会导致{{1}将A添加到Y会导致A

如果您认为后继者添加1,那么如果Z(X+1)*Y且{{{}},则表示ZX*Y 1}}是A。这是有道理的,因为A+YZ(X+1)*Y

答案 1 :(得分:1)

在此上下文中,A(X-1) * Y的值。您可以使用mult规则递归地找到此值,然后将其添加到Y规则中的add以获取最终结果。它将乘法写为X * Y = (X - 1) * Y + Y

真正发生的事情是它调用add X次,并且每次都将Y添加到最终结果(从零开始)。这是在重复添加时利用乘法。这是手工追踪:

  1. mult(3, 2, Z)
    初次通话

  2. mult(2, 2, A_1), add(2, A_1, Z)
    减去1个框架X

  3. mult(1, 2, A_2), add(2, A_2, A_1)
    试。

  4. mult(0, 2, A_3), add(2, A_3, A_2)
    最后一次

  5. mult(0, 2, A_3)
    只有一种可能性,因为零无法匹配s(x)A_3设置为0.

  6. mult(0, 2, 0), add(2, 0, A_2)
    第4步,但取代A_3。我们现在知道A_2必须是2。

  7. mult(1, 2, 2), add(2, 2, A_1)
    第3步,但替换A_2。我们现在知道A_1必须是4。

  8. mult(2, 2, 4), add(2, 4, Z)
    第2步,但替换为A_1。我们现在知道Z必须是6,最终结果。

  9. 对于步骤2到4,您将向下计数,以查找重复添加操作所需的次数。步骤5是基本情况,从零开始最终结果。在步骤6到8中,您执行添加。这给出了Z = 6 = 2 + 2 + 2

    的结果