バックグラウンド
述語eval(P、A、R)を書く必要があります。ここで、
Pは多項式係数のリストを表します。つまり、1 + 2x + 3x^2は[1,2,3]として表されます。
AはXの値を表します
。RはX=Aでの多項式の結果です。
例: eval([3,1,2]、3、R)はR = 24を生成し ます。*編集、以前は正しくない例
この記事のアキュムレータとLearnPrologNowの例を使用しようとしています。
私のアルゴリズム:
0。結果変数と指数変数を0に初期化し
ます。1。リストの先頭を取ります。
2.リストの先頭にA^(指数)を掛けます。
3.結果と指数を更新します。
私のコード:
eval(P,A,R) :- accEval(P,A,0,0,R).
accEval(([H|T]),A,Pow,Accres,R) :-
Rnew is (Accres+H*(A**Pow)),
Pownew is Pow+1,
R = Accres,
accEval(T,A,Pownew,Rnew,Rnew). % *See below
accEval([],A,Pow,Accres,Accres).
% *Previously, when the second Rnew in this line was R instead, output was "no".
トレースを生成します:
| ?- eval([1,2],3,R).
1 1 Call: eval([1,2],3,_20) ?
2 2 Call: accEval([1,2],3,0,0,_20) ?
3 3 Call: _126 is 0+1*3**0 ?
3 3 Exit: 1.0 is 0+1*3**0 ?
4 3 Call: _157 is 0+1 ?
4 3 Exit: 1 is 0+1 ?
5 3 Call: accEval([2],3,1,1.0,1.0) ?
6 4 Call: _218 is 1.0+2*3**1 ?
6 4 Exit: 7.0 is 1.0+2*3**1 ?
7 4 Call: _249 is 1+1 ?
7 4 Exit: 2 is 1+1 ?
8 4 Call: accEval([],3,2,7.0,7.0) ?
8 4 Exit: accEval([],3,2,7.0,7.0) ? % We have the correct answer.
5 3 Exit: accEval([2],3,1,1.0,1.0) ? % Wait! What are you doing!?
2 2 Exit: accEval([1,2],3,0,0,0) ? % Why is this falling back out?
1 1 Exit: eval([1,2],3,0) ?
R = 0 % Incorrect. The answer should be 7.
私のコードで述べたように、以前の試みではRの値は生成されず、代わりに「no」または他の実装では「yes」が生成されました。
質問
結果が失われ、元の呼び出しに戻されないのはなぜですか?