3

私はPrologの初心者であり、この関数が数値のフィボナッチを計算するのを手伝ってほしい...最初にY=0とZ=1を追加し、次にY=ZとZ=Y+Zとそれぞれを呼び出すカウンターがXに等しくなるまでカウンターCの値をインクリメントするとき.....問題は、XがMに等しくなくてもプロローグが2番目の句を実行しないため、結果が常に1に等しいことですが、理由はわかりません....。

X:計算されるフィボナッチY:フィボナッチ数列の最初の数Z:フィボナッチ数列の2番目の数C:初期値が0のカウンター
T:Y + Z

predicates
fib_tail(integer,integer, integer,integer, real)
clauses
fib_tail(X,Y , Z,M, T):- X=M,T = Y + Z,!.
fib_tail(X,Y ,Z, C , T):-
  T = Y + Z,
  NY = Z,
  NZ = Y + Z,
  NC = C + 1,
  fib_tail(X, NY, NZ, NC, NT).

goal
fib_tail(5 ,0 ,1 ,0, T)
4

1 に答える 1

2

2番目の句fib_tailには2つの欠陥があります。

  • Xは決してインクリメントされません
  • NTはシングルトンであるため、呼び出し元に値を「送信」しません。

正しくインクリメントされたCと比較して、Xをインクリメントする必要がないことを強調表示するコメントを編集します。

二重再帰的定義を実装する前に、それが機能しているときに、コストのかかる呼び出しを削除することを最適化する必要があると思います。

于 2012-10-29T21:57:58.100 に答える