【问题标题】:Sum of a series in PrologProlog中一系列的总和
【发布时间】:2013-03-04 19:18:33
【问题描述】:

我想使用 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" 。为什么 ?我已经尝试了很多,但无法获得预期的输出。

【问题讨论】:

  • 你能分享一下你是如何调用 sum 谓词的吗?
  • 我用 sum(2,7,R) 调用 sum 谓词。答案应该是 255 ,但令人惊讶的是输出是“否”。

标签: prolog exponentiation


【解决方案1】:

你错过了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
    ).

edit SWI-Prolog 关于运算符 (**)/2 的文档不正确:最好使用 (^)/2,正如 @false 所言

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多