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
。希望能帮助到你。请注意,这不是解决问题的唯一方法。