1

我想使用 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

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

4

2 回答 2

0

你错过了 else 分支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(最后调用优化)和内置 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 所述

于 2013-03-15T23:09:59.533 回答
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).
于 2013-03-15T23:15:34.647 回答