シーケンスリストの-番目の要素が-basedであるようなN
シーケンスの要素を生成したいようです。3つの開始要素も、仕様の一部として事前設定する必要があります。あなたはで始まっているようです。f
f(N) = f(N-1) + f(N-2) + f(N-3)
f(X)
X
0
[0,0,1, ...]
Prologのレイジーリストからのアプローチを使用していますか?:
seqList(N,L):- N >= 3, !,
L=[0,0,1|X], N3 is N-3, take(N3, seq(0,0,1), X-[], _).
next( seq(A,B,C), D, seq(B,C,D) ):- D is A+B+C.
これで、これらすべての関数を融合してインライン化し、1つの再帰的定義に到達することができます。
しかし、あなたはそれを直接行うことができます。解決策を取り戻すには、質問を書き留めるだけです。
question(N,L):-
0,0,1から始めるので、...書き留めます。
L = [0, 0, 1 | X],
3つの要素が与えられているので、もっと知る必要があるだけですN-3
。それを書き留め:
N3 is N-3,
これで、問題がいくらか軽減されました。次に、要素を見つけN-3
てリストに入れる必要がありX
ます。そのためにワーカー述語を使用します。また、各ステップで先行する3つの番号を知っている必要があります。
worker( N3, 0, 0, 1, X).
したがって、ワーカーが知っておくべきことを書き留めてください。
worker(N, A, B, C, X):-
N
が0の場合、停止する必要があります。X
次に、空のリストです。それを書き留め。
N = 0, X = [] .
N
whenが0より大きい場合は、別の句を追加します。
worker(N, A, B, C, X):-
N > 0,
次の要素は、先行する3つの数値の合計であることがわかります。それを書き留めます。
D is A + B + C,
リストの次の要素は、引数リストの一番上の要素(最後のパラメーター)です。それを書き留め:
X = [D | X2 ],
追加する要素が1つ少なくなりました。それを書き留め:
N2 is N - 1,
リストの残りを見つけるために、最後の3つの数字はとB, C,
ですD
。次に、残りはworker
まったく同じ方法で検出されます。
worker( N2, B, C, D, X2).
それでおしまい。question
述語はあなたの解決策です。お好みに合わせて名前を変更してください。