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 (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 を使用することをお勧めします。

于 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 に答える