我找到了一个非常好的Erlang实现,用于按位置分组列表成员。
everynth(List, N) ->
[ lists:reverse(Y)
|| Y <- lists:foldl(
fun(X, [H|T]) -> T++[[X|H]] end,
lists:duplicate(N, []),
List)
].这将提供的列表(列表)按索引位置排序为3组:
everynth([1, 2, 3, 4, 5, 6, 7, 8, 9], 3).给出
[[1,4,7],[2,5,8],[3,6,9]].我也想在Prolog中做同样的事情,但是我不知道如何去做。你能帮帮我吗?谢谢。
发布于 2016-10-28 16:58:57
不太优雅,但应该能工作。
getEveryNth([], _, [], _).
getEveryNth([H|Ti], N, [H|To], N) :-
getEveryNth(Ti, 1, To, N).
getEveryNth([_|Ti], M, Lo, N) :-
M < N,
Mp1 is M+1,
getEveryNth(Ti, Mp1, Lo, N).
everyNthH(_, 0, [], _).
everyNthH([H|Ti], M, [[H|To] | Lo], N) :-
M > 0,
Mm1 is M-1,
getEveryNth(Ti, 1, To, N),
everyNthH(Ti, Mm1, Lo, N).
everyNth(L, N, LL) :-
everyNthH(L, N, LL, N).从…
everyNth([1, 2, 3, 4, 5, 6, 7, 8, 9], 3, L)我得到(L是统一的)
[[1,4,7],[2,5,8],[3,6,9]]发布于 2016-10-29 10:15:54
为了找到索引之间的适当关系,我不得不做一些尝试和测试,您可以从变量的名称中看到,为了简化调试,每个the _starting/4都是“未内联的”。
everynth(L, P, Gs) :-
findall(G, (
between(1, P, S),
everynth_starting(L, P, S, G)
), Gs).
everynth_starting(L, P, S, G) :-
findall(E, (nth1(I, L, E), S mod P=:=I mod P), G).nth1/3充当成对索引/元素的生成器。
https://stackoverflow.com/questions/40309513
复制相似问题