Prolog中的切换参数

问题描述 投票:0回答:1

我有这个小的Prolog程序。仅将两个数字相加即可。

mult(0, _, 0).
mult(1, X, X).
mult(X, Y, R) :- X > 1, X1 is X - 1, mult(X1, Y, R1), R is Y+R1.

现在,我想到了通过对参数进行重新排序来优化此方法,以使X始终是两个参数中较小的一个,因此递归较少,所以我添加了这一行:

mult(X, Y, R) :- X > Y, mult(Y, X, R).

这不起作用,我也不十分清楚为什么。例如,mult(3, 0, 0).true,然后是false回答。我显然只是想让它返回一次true,然后再返回false。有些组合也可以像mult(0, 3, 0).一样正常工作。

提前感谢。

prolog
1个回答
0
投票

它可以工作,但是会产生多余的解决方案。问题是您只有一个基本情况mult(0,_,0).,它仅检查第一个参数为0,而没有一个基本情况,只要前两个参数中的任何一个为0,该基本情况都将给出0。同样,您的第二个基本情况是不需要。

[当您添加“交换参数”子句时,您可能会在X> Y时互换它,或者仅继续下一个子句,这就是为什么当第二个参数为0时最终得到多个解决方案的原因。

例如,查询mult(3,0, M).可以通过首先将3与0交换来成功,然后调用mult(0,3, M).将以M = 0成功,然后继续执行下一个从X减去1并再次调用mult(2,0, M1).的子句。可以通过首先交换参数或遍历下一个子句来产生解决方案,直到第一个参数为1为止,以防止继续使用最后一个子句。

© www.soinside.com 2019 - 2024. All rights reserved.