Prolog - 过滤列表

时间:2012-07-10 14:46:16

标签: list filter prolog

所以我有这个功课应该是tommorow。我必须过滤列表中的每个第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).

但它不会这样工作,因为在第三行中它会尝试匹配X和返回X以及第二次它与第0次匹配。

2 个答案:

答案 0 :(得分: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的第一个子句是递归的终止。当输入列表中没有更多项目时,它应该给出一个空列表。

everynth/4的第二个子句处理第n个项目,它必须将输入项目放在输出列表中,并继续处理重新启动项目计数器的其余项目。

everynth/4的第三个句子处理不是第n个元素的项目,因此你必须跳过该项目,递减计数器并继续剩下的项目。

答案 1 :(得分: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] .