Prolog递归相乘

时间:2018-12-12 22:23:55

标签: recursion prolog

我正在尝试递归地在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不是一个函数。

1 个答案:

答案 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谓词的速度。我将其保留为练习。