这是我的第一个逻辑编程语言课程,所以这是一个非常愚蠢的问题但我不能为我的生活弄清楚这个功能谓词如何工作我试图使搜索树跟踪它但我仍然无法理解它是如何工作的
mult(_ , 0 ,0).
mult(X , Y, Z):-
Y > 0,
Y1 is Y - 1,
mult(X,Y1,Z1),
Z is Z1 + X.
exp2(_ ,0 , 1).
exp2(X,Y,Z):-
Y > 0,
Y1 is Y - 1,
exp2(X , Y1 , Z1),
mult(X,Z1,Z).
我到目前为止得到了我将调用exp2谓词直到我达到Y将要为零的点然后我将从那里开始相乘,但是在最后一次调用它在exp2时(2,1,Z)什么是Z值以及谓词如何起作用?
非常感谢=)
编辑:对于迟到的回复我真的很抱歉我遇到了一些问题但无法访问我的电脑答案 0 :(得分:1)
我将在此处详细介绍mult/3
,但我会将exp2/3
作为练习留给您。它很相似......
正如我在评论中提到的,您希望将Prolog谓词作为规则阅读。
mult(_ , 0 ,0).
此规则表示 0是将任何内容(_
)乘以0 的结果。变量_
是一个匿名变量,这意味着它不仅仅是一个变量,而且你并不关心它的价值。
mult(X, Y, Z) :-
这就是说, Z
是将X
乘以Y
的结果,如果 ... 。
Y > 0,
确定Y
大于0。
Y1 is Y - 1,
Y1
的值为Y
减1。
mult(X, Y1, Z1),
而Z1
是将X
乘以Y1
的结果。
Z is Z1 + X.
而Z
是Z1
加X
的值。
或者完全阅读mult(X, Y, Z)
规则:
Z
是将X
乘以Y
,如果Y
大于0,Y1
的结果}是Y-1
,Z1
是将X
乘以Y1
的结果,而Z
是将Z1
添加到{{}的结果1}}
现在深入挖掘,您可以看到这是一个递归定义,因为两个数字的乘法是由另一个乘法定义的。但正在增加的很重要。在数学上,它使用X
等于x * y
的事实。所以它不断地将第二个被乘数减少1,并在稍微减少的问题上调用自己。这种递归减少何时最终结束?好吧,如上所示,第二个规则说x * (y - 1) + x
必须大于0.如果Y
为0,那么第一个规则Y
适用,递归最终返回0
如果你不确定递归如何工作或不熟悉它,我强烈建议谷歌搜索它来理解它。实际上,这是一个适用于许多计算机语言的概念。但是通过与其他语言的比较,你需要小心学习Prolog。 Prolog与Java,Python,C,C ++等程序/命令式语言的行为根本不同。最好习惯解释Prolog 规则和事实如上所述。
答案 1 :(得分:0)
假设您要计算2 ^ 3作为将结果分配给R. 为此,您将调用exp2(2,3,R)。 它将递归调用exp2(2,2,R1),然后调用exp2(2,1,R2),最后调用exp(2,0,R3)。
此时exp(_,0,1)将匹配,R3将分配给1。
然后当调用堆栈展开时,将乘以3三次。
在Java中,此逻辑将按如下方式编码。执行将几乎相同的路线。
public static int Exp2(int X, int Y) {
if (Y == 0) { // exp2(_, 0, 1).
return 1;
}
if (Y > 0) { // Y > 0
int Y1 = Y - 1; // Y1 is Y - 1
int Z1 = Exp2(X, Y1); // exp2(X, Y1, Z1);
return X * Z1; // mult(X, Z1, Z).
}
return -1; // this should never happen.
}