Recursion Prolog递归乘法

Recursion Prolog递归乘法,recursion,prolog,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不是一个函数 这里构造的是谓词。谓词与计算机科学中的函数不同,你不能写A是B+一些pred(C),或者至少在ISO 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
不是一个函数

这里构造的是谓词。谓词与计算机科学中的函数不同,你不能写
A是B+一些pred(C)
,或者至少在ISO Prolog中我知道的不一样,而且绝对不能不添加一些额外的逻辑

为了传递值,使用变量。因此,我们可以递归调用
mult/3
谓词,并使用将与结果统一的变量。然后我们可以使用它执行算术运算,如:

mult(0, _, 0).
mult(X, Y, Z) :-
    X1 is X - 1,
    mult(X1, Y, Z1),
    Z is Y + Z1.
然后,我们获得例如:

?- mult(14, 25, Z).
Z = 350 ;
false.

通过使用累加器实现一个版本,可以提高这个
mult/3
谓词的速度。我把这个留作练习。

Prolog没有函数,它有谓词,所以不能做
X是A+pred(Y)
这样的事情。是的,
is/2
解释了某些函子,但上面并不是它应该如何工作的。那么解决这个问题的方法是什么呢?可以用累加器来改进它,到底是什么?“你在这里定义的是谓词。”--不确定这作为一个句子是否有意义。也许你的意思是“你拥有的是一个谓词”?另外,
14*25
是350而不是375。我认为
mult(0,Y,Y)
应该是
mult(0,Y,Y)
@Dunes:是的。。。不幸的是,我没有检查语义:)我模糊地回忆起曾经有一段时间,作为扩展,SWI Prolog允许您为
is/2
的右侧声明数学函数,但那段时间已经过去了,不能这样做。
?- mult(14, 25, Z).
Z = 350 ;
false.