首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Prolog中按位置对列表元素进行分组

在Prolog中按位置对列表元素进行分组
EN

Stack Overflow用户
提问于 2016-10-28 16:39:58
回答 2查看 539关注 0票数 0

我找到了一个非常好的Erlang实现,用于按位置分组列表成员。

代码语言:javascript
运行
复制
everynth(List, N) ->
   [ lists:reverse(Y)
     || Y <- lists:foldl(
                     fun(X, [H|T]) -> T++[[X|H]] end,
                     lists:duplicate(N, []),
                     List)
   ].

这将提供的列表(列表)按索引位置排序为3组:

代码语言:javascript
运行
复制
everynth([1, 2, 3, 4, 5, 6, 7, 8, 9], 3).

给出

代码语言:javascript
运行
复制
[[1,4,7],[2,5,8],[3,6,9]].

我也想在Prolog中做同样的事情,但是我不知道如何去做。你能帮帮我吗?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2016-10-28 16:58:57

不太优雅,但应该能工作。

代码语言:javascript
运行
复制
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).

从…

代码语言:javascript
运行
复制
everyNth([1, 2, 3, 4, 5, 6, 7, 8, 9], 3, L)

我得到(L是统一的)

代码语言:javascript
运行
复制
[[1,4,7],[2,5,8],[3,6,9]]
票数 0
EN

Stack Overflow用户

发布于 2016-10-29 10:15:54

为了找到索引之间的适当关系,我不得不做一些尝试和测试,您可以从变量的名称中看到,为了简化调试,每个the _starting/4都是“未内联的”。

代码语言:javascript
运行
复制
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充当成对索引/元素的生成器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40309513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档