我正在尝试递归地在Prolog中将两个数字相乘,即3*4 = 3+3+3+3 = 12
。
我的代码是:
mult(0,Y,Y).
mult(X,Y,Z) :-
NewX is X-1,
Z is Y + mult(NewX,Y,Z).
但是我一直处于无限循环中,或者被告知mult
不是一个函数。
答案 0 :(得分:2)
您在这里构造的是一个谓词。谓词与计算机科学中的函数不相同,您不能编写A is B + some_pred(C)
,或者至少不能据我在ISO Prolog中所知,并且肯定不能不添加一些额外内容逻辑。
为了传递值,使用变量。因此,我们可以递归地调用mult/3
谓词,并使用结果将被 unified 统一的变量。然后,我们可以对其进行算术运算,例如:
mult(0, _, 0).
mult(X, Y, Z) :-
X1 is X - 1,
mult(X1, Y, Z1),
Z is Y + Z1.
请注意,您可以不将(不同的)值重新分配给变量。因此,如果像您在问题中所做的那样,两次使用Z
,然后给定Y
不是0
,这将失败。
但是,上面的方法仍然不够用,因为它会产生结果,但是会陷入无限循环,因为如果它(最终)调用mult(0, 4, Z)
(4
在这里只是一个值) ,有两种方法可以解决此问题:基本情况和递归情况。
因此,对于第二种情况,我们需要一个“警卫”,例如:
mult(0, _, 0).
mult(X, Y, Z) :-
X > 0,
X1 is X - 1,
mult(X1, Y, Z1),
Z is Y + Z1.
然后我们获取例如:
?- mult(14, 25, Z).
Z = 350 ;
false.
通过实现带有 accumulator 的版本,可以提高此mult/3
谓词的速度。我将其保留为练习。