0

以下にルールを書く必要があります:

リストL1にリストLの最初のN個の要素が同じ順序で含まれている場合に成功する、述語take(L、N、L1)のルールを記述します。次のクエリは、この述語の使用例を示しています。

?- take([5,1,2,7], 3, L1).
L1 = [5,1,2]
?- take([5,1,2,7], 10, L1).
L1 = [5,1,2,7]

私の考えは、L1が空になるまで、いつでも2つのリストの最初の数を削除することです。また、car([X | _]、X)を使用して、最初のリスト==2番目のリストまで毎回最後の番号を削除できると考えています。すでに長さ(L、Len)を書いていますが、次にどうしたらいいかわかりません...

私のコードは次のとおりです。

take(L,X,[]).(I know it miss something, but I don't know how to do...)
take(H|L,N,H|L1):- take(L,X,L1), N is X-1.

=========================更新======================== =========================ありがとう1638891!現在、コードは

    take(L,0,[]).
    take([H|L],N,[H|L1]):- take(L,X,L1), N is X+1.

しかし、2番目のケースでは機能しません。

   ?- take([5,1,2,7], 10, L1).
   L1 = [5,1,2,7]

追加してみました

    take([],X,[])->!.

しかし、「エラー:is / 2:引数が十分にインスタンス化されていません」というポップアップが表示されます。

4

2 に答える 2

0

あなたは実際にXを書きたいのですがN-1です。

take(L,0,[]).
take([H|L],N,[H|L1]):- take(L,X,L1), X is N-1.

原則として、あなたのルールを声に出して読んでみてください。あなたが書いた最初のルールは、「空のリストは、Lの最初のX要素を持つリストです」と読みます。ただし、基本ケースとして「空のリストはLの最初の0要素を含むリスト」である必要があります。

于 2012-12-03T08:52:42.393 に答える
0

@ user1638891は、減算を交換するのを忘れており、使用可能な要素よりも多くの要素が要求された場合のケースをカバーしています。

take(_,0,[]).
take([],_,[]).
take([H|L],N,[H|L1]) :- N > 0, X is N-1, take(L,X,L1).
于 2012-12-03T12:52:18.217 に答える