prolog

时间:2016-05-04 02:16:52

标签: prolog clpfd multiplying

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).

它会永远持续下去,为什么这不会停留在上述基本情况?

非常感谢帮助。

1 个答案:

答案 0 :(得分:3)

对于整数运算,请使用约束。所有严肃的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来做到这一点!