我想找一个使用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
我相信上面的代码是对的。但是当我运行程序时,它显示输出“否”。为什么?我已经尝试了很多,但无法获得预期的输出。
答案 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).