我正在研究一个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,给出元素,等等。
如何在实施中解决这些特定问题?
答案 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
。希望能帮助到你。请注意,这不是解决问题的唯一方法。