2

だから私は明日のためにこの宿題を持っています。リストのn番目ごとの要素をフィルタリングして、リストとして返す必要があります。したがって、たとえば:

?-everyNth(3、[a、b、c、d、e、f]、Rs)。Rs = [c、f]。

私の考えは基本的に:

everynth(N, [X|Xs], L) :- everynth(N, [X|Xs], N, L).
everynth(N, [], C, L).
everynth(N, [X|Xs], 0, [X]) :- everynth(N, Xs, N, [X]).
everynth(N, [X|Xs], C, L) :- C1 is C -1,
  everynth(N,Xs,C1,L).

ただし、この方法では機能しません。これは、3行目でXを一致させようとし、2回目にXとカウント0を返すためです。

4

2 に答える 2

3

もうすぐです。これらの変更を確認してください。

everynth(N, L, NL) :- everynth(N, L, N, NL).

everynth(_, [], _, []).
everynth(N, [X|Xs], 1, [X|NXs]) :- everynth(N, Xs, N, NXs).
everynth(N, [_|Xs], C, NXs) :- C1 is C-1, C1>0,
  everynth(N,Xs,C1,NXs).

の最初の節はeverynth/4再帰の終了です。入力リストにアイテムがなくなると、空のリストが表示されます。

の2番目の句はeverynth/4、n番目のアイテムを処理します。入力アイテムを出力リストに入れ、残りのアイテムを処理し続けて、アイテムカウンターを再開する必要があります。

また、の3番目の句はeverynth/4、n番目の要素ではないアイテムを処理するため、アイテムをスキップし、カウンターをデクリメントして、残りのアイテムを続行する必要があります。

于 2012-07-10T14:58:51.357 に答える
1
everynth(_, _, [], R, R).
everynth(1, M, [X|Xs], Z, R) :- append(Z, [X], Z1),  everynth(M, M, Xs, Z1, R).              
everynth(N, M, [_|Xs], Z, R) :- N > 1, N1 is N - 1, everynth(N1, M, Xs, Z, R).




?- everynth(3, 3, [a,b,c,d,e,f], [], Rs).
Rs = [c, f] .
于 2012-07-10T15:04:29.737 に答える