2

この質問では述語を書く必要がありますがseqList(N, L)、これは L がリストの場合に満たされます[f0, . . . , fN]

どこfN = fN-1 + fN-2 + fN-3

私のコードは、与えられたリストの先頭を比較することであり、比較すると true または false を返します。

seqList(_,[]).
seqList(N,[H|T]) :-
    N1 is N - 1,
    seq(N,H),
    seqList(N1,T).

ただし、値が逆の場合にのみ有効です。たとえば、seqList(3,[1,1,0,0]) は true を返しますが、リストは seqList(3,[0,0,1,1) に対して true を返す必要があります。 ]))。リストを逆にして正しく検証する方法はありますか?

4

1 に答える 1

3

シーケンスリストの-番目の要素が-basedであるようなNシーケンスの要素を生成したいようです。3つの開始要素も、仕様の一部として事前設定する必要があります。あなたはで始まっているようです。ff(N) = f(N-1) + f(N-2) + f(N-3)f(X)X0[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 = [] .

Nwhenが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述語はあなたの解決策です。お好みに合わせて名前を変更してください。

于 2012-08-18T14:27:31.193 に答える