Prolog中级数的和

Prolog中级数的和,prolog,exponentiation,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 我相信上面

我想用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输出。为什么?我尝试了很多,但是没有得到预期的结果

您错过了X>1的else分支,如果删除它,您将得到一个结果:

...
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序言文档不正确:最好使用^/2,如@false所述。我的另一个解决方案如下:

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

你能分享一下如何调用sum谓词吗?我用sum2,7,R调用sum谓词。答案应该是255,但令人惊讶的是输出结果是否定的。^/2应该代替**/2。@false:say**/2是ISO,而^/2是向后兼容的……这些文档是假的。请参阅和**/2在ISO中始终给出浮点值。