Prolog - 列出列表中的每个第n个元素

时间:2016-11-26 19:04:40

标签: list prolog

我正在研究一个Prolog程序,它应该将列表中的每个 n th 元素加载到另一个列表中。例如:

?- pred([a,b,c,d,e,f,g,h,i,j],3,R) => 
R = [c,f,i]

pred是我试图实施的谓词。

但老实说,我不知道该怎么做。我知道我需要一个计数器,它代表我头部的当前位置,所以它将是一个/ 4谓词,后面总结为一个/ 3,就像 nth(list,number,result): - nth(list,number,result,counter)或者类似的。

虽然,我不知道如何给头部一个可以自行重置的位置编号。因为一旦它命中 n (让我们说n=3,这是列表中的c),它必须在逻辑上再回到1并再次计数到3,给出元素,等等。

如何在实施中解决这些特定问题?

1 个答案:

答案 0 :(得分:1)

如何实现这一点的一个例子:

nth_pos(L, N, R):-
    nth_pos(L, 1, N, [], R).

nth_pos([], I, N, Acc, Acc).

nth_pos([H|T], I, N, Acc, R):-
    I =:= N,
    append(Acc, [H], Acc2),
    I2 is 1,   
    nth_pos(T, I2, N, Acc2, R).

nth_pos([H|T], I, N, Acc, R):-
    I < N,
    I2 is I + 1,   
    nth_pos(T, I2, N, Acc, R).

<强>试验运行:

?- nth_pos([a,b,c,d,e,f,g,h,i,j],3,R).
R = [c, f, i] .

?- nth_pos([a,b,c,d,e,f,g,h,i,j],1,R).
R = [a, b, c, d, e, f, g, h, i|...]
  

但老实说,我不知道怎么做。我知道我需要一个柜台,   这代表我头部的当前位置,所以它会成为一个   / 4谓词总结为a / 3后一个,就像   第n个(列表,数字,结果): - 第n个(列表,数字,结果,计数器)或   similiar。

是的,你走在正确的轨道上,注意也使用累加器来建立列表,所以我们得到pred/5。希望能帮助到你。请注意,这不是解决问题的唯一方法。