0

基本的に、(0th、2nd、4th など)から偶数のインデックス付き要素のみを含む、生成された新しいリストeven_elts(L,M)である述語を記述する必要があります。LM

add_tail([X],[],X).
add_tail([H|NewT],[H|T],X) :-
   add_tail(NewT,T,X).

even_elts(L,[]) :- L = [].
even_elts(L,M) :- even_elts2(L,M,1).
even_elts2(L,[H2|T2],Ct) :-
   Ct2 is Ct + 1,
   ((Ct2 mod 2) =:= 0, add_tail(L,L2,H2), even_elts2(L2,T2,Ct2); even_elts2(L,T2,Ct2)).
even_elts2(_,[],_) :- !.

これは、Mが空であるか、1 つまたは 2 つの要素が含まれている場合に機能します。ただし、M残りではなく、最初の偶数インデックス要素のみを取得します。ポインタ

編集:新しいリストを作成してデータをコピーするのではなく、奇数のインデックス付き要素を削除することにより、問題を別の方法で解決しました。しかし、誰かが私の元のコードの解決策を見つけられるなら、私は興味があります.

4

3 に答える 3

3

あなたはこれを実際よりもはるかに複雑にしています。パターン マッチングを使用して各偶数要素を取得し、それらを 2 番目の (出力) 引数に収集できます。

% an empty list does not have even elements
even_elts([], []).
% for all other lists, skip the second element (_),
% add the first to the output, recurse
even_elts([X, _ | L], [X | R]) :-
    even_elts(L, R).
于 2013-05-07T18:49:17.560 に答える