Prolog系列的总和

时间:2013-03-15 22:37:26

标签: prolog exponentiation

我想找一个使用Prolog程序的系列之和。为此,我编写了以下程序:

pow(N,1,R):- R is N.
pow(N,M,R):- X is M-1,pow(N,X,R1),R is R1*N.

sum(N,1,R) :- R is N+1 . 
sum(N,M,R) :- X is M-1, X>1,sum(N,X,R1),pow(N,M,R2), R is (R1+R2).

我想找到以下系列的总和:

1+n+n^2+n^3+..................+n^m

我相信上面的代码是对的。但是当我运行程序时,它显示输出“否”。为什么?我已经尝试了很多,但无法获得预期的输出。

2 个答案:

答案 0 :(得分:0)

你错过了X>1的其他分支,如果删除它,你会得到一个结果:

...
sum(N,M,R) :- X is M-1, sum(N,X,R1), pow(N,X,R2), R is (R1+R2).
...
?- sum(2,3,X).
X = 15 ;
^C

但程序没有终止(^ C用于中断循环)。

我会使用累加器重写,以获得LCO(Last Call Optimization)和内置pow的更高效率:

sum(N,M,R) :- sum(N,M,0,R).

sum(N,M,A,R) :-
    (   M > 0
    ->  A1 is A + N^M, %% N**M,
        M1 is M-1,
        sum(N,M1,A1,R)
    ;   R is A + 1
    ).

编辑有关运营商(**)/ 2的SWI-Prolog文档不正确:更好地使用(^)/ 2,正如@false所述

答案 1 :(得分:0)

我的另一个解决方案如下:

pow(N,1,R):- R is N.
pow(N,M,R):- X is M-1,pow(N,X,R1),R is R1*N.

sum(N,1,R) :- R is N+1 . 
sum(N,M,R) :- M>1,X is M-1,sum(N,X,R1), R is (R1+N**M).