prolog的新手。
编辑:使用swi-prolog
我想在没有实际使用乘法方法的情况下递归地执行乘法方法在prolog中已经做的事情。
我想要实现的算法类似于:
multn(N1, N2, output){
if (n2 <=0) return output;
else
multn(N1, (N2-1), output + N1)
}
Ex:4 * 4 = 4 + 4 + 4 + 4 = 16
编辑*:只传递这个算法的正数。
我的知识db看起来像:
multn(Num1, 0, Result) :- Result is 0.
multn(Num1, Num2, Result) :-
NewNum2 = Num2 - 1,
multn(Num1, NewNum2, NewResult),
Result is Num1 + NewResult.
然而,当我打电话时:
?- multn(2,2,R).
它会永远持续下去,为什么这不会停留在上述基本情况?
非常感谢帮助。
答案 0 :(得分:3)
对于整数运算,请使用clpfd约束。所有严肃的Prolog系统都提供它们。例如,对于SICStus Prolog,将:- use_module(library(clpfd))
放入初始化文件中,以便在所有程序中提供CLP(FD)约束。
使用CLP(FD)约束和一些小修改,您的初始程序变为:
int_int_prod(_, 0, 0). int_int_prod(Num1, Num2, Result) :- NewNum2 #= Num2 - 1, int_int_prod(Num1, NewNum2, NewResult), Result #= Num1 + NewResult.
现在重点:你显然意味着你的条款相互独占。
在适当的位置插入Num2 #> 0
来做到这一点!