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

问题描述:

我正在开发一个Prolog程序,它应该将每个列表的nth元素加载到另一个列表中。例如:Prolog - 给出列表中的每个第n个元素

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

哪里pred是我试图实现谓语。

但我真的不知道该怎么做。我知道我需要一个计数器,它代表了我脑袋的当前位置,所以它将是一个/ 4谓词,后面总结为1/3,比如 第n个(列表,数字,结果): - 第n个(列表,数字,结果,计数器)或类似。

虽然,我不知道如何给头部一个位置号码,可以重置自己。因为一旦它遇到n(假设n=3,它是列表中的c),它必须回到逻辑1并再次计数到3,发出元素,依此类推。

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

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

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|...] 

但我真的不知道该怎么做。我知道我需要一个计数器, 它代表了我脑袋的当前位置,所以它将成为一个后面总结为1/3的谓词,如 第n个(列表,数字,结果): - 第n个列表,编号,结果,计数器)或 类似。

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