我不明白为什么这个乘法的递归定义是有效的。
我得到了添加部分,但在这种情况下“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).
我不明白为什么这个乘法的递归定义是有效的。
我得到了添加部分,但在这种情况下“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).
要理解谓词,请尝试“阅读”它们所说的内容。
首先阅读add/3
定义...
add(0,X,X).
添加
0
到X
结果中X
。
add(s(X),Y,Z):-add(X,s(Y),Z).
添加
s(X)
(的后继X
)到Y
结果Z
如果添加X
到s(Y)
(的后继Y
)导致Z
。
如果我们将后继者视为加 1,那么这就是说(X + 1) + Y
结果为Z
ifX + (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
by的后继Y
结果为A
,并Y
与A
结果相加Z
。
如果您将后继者视为加 1,那么这就是说if (X+1)*Y
is和is 。这是有道理的,因为is which would be 。Z
X*Y
A
A+Y
Z
(X+1)*Y
(X*Y)+Y
A+Y
在这种情况下,A
是 的值(X-1) * Y
。您使用规则递归地找到此值,mult
然后将其添加到Y
规则add
中以获得最终结果。它将乘法写为X * Y = (X - 1) * Y + Y
真正最终发生的是它调用add
X
时间,并且每一次它都会添加Y
到最终结果(从零开始)。这是利用乘法作为重复加法。这是手动跟踪:
mult(3, 2, Z)
初次通话
mult(2, 2, A_1), add(2, A_1, Z)
减去 1 帧X
mult(1, 2, A_2), add(2, A_2, A_1)
再次。
mult(0, 2, A_3), add(2, A_3, A_2)
最后一次
mult(0, 2, A_3)
只有一种可能性,因为零无法匹配s(x)
。A_3
设置为 0。
mult(0, 2, 0), add(2, 0, A_2)
第 4 步,但A_3
被替换。我们现在知道A_2
必须是 2。
mult(1, 2, 2), add(2, 2, A_1)
第 3 步,但A_2
被替换。我们现在知道A_1
必须是 4。
mult(2, 2, 4), add(2, 4, Z)
第 2 步,但A_1
被替换。我们现在知道Z
必须是 6,最后的结果。
对于第 2 步到第 4 步,您正在向下计数,以找出需要重复加法操作的次数。第 5 步是基本情况,最终结果从零开始。在步骤 6 到 8 中执行加法。这给出了结果Z = 6 = 2 + 2 + 2