Prolog子列表中的每个第i个元素

时间:2014-09-20 00:48:35

标签: prolog

是否可以将列表中的每个第i个元素复制到一个三元谓词子列表(Element,List1,List2)和内置长度并追加的子列表? 我知道,使用4元素辅助谓词,它变得相当微不足道,但它不是我需要的。 任何人都可以建议一个策略吗?

2 个答案:

答案 0 :(得分:2)

使用一些内置的声明解决方案非常简单:

sublist(Element, List1, List2) :-
    findall(E, (nth1(I, List1, E), 0 is I mod Element), List2).

在显式迭代时:

sublist(Element, List1, List2) :-
    (   N is Element-1,
        length(T, N),
        append(T, [E|R], List1)
    ->  sublist(Element, R, ListR),
        List2 = [E|ListR]
    ;   List2 = []
    ).

在那里你可以看到如何使用Boris'建议

答案 1 :(得分:1)

您可以使用lentgth/2将第一个参数作为变量,将第二个参数作为整数,以创建未实例化的变量列表,如下所示:

?- length(L, 4).
L = [_G936, _G939, _G942, _G945].

如果现在使用append/3将此列表作为第一个参数,将变量作为第二个参数,它将在第三个参数中拆分列表:

?- length(A, 4), append(A, B, [a,b,c,d,e,f,g,h]).
A = [a, b, c, d],
B = [e, f, g, h].

因此,如果您想要说出列表的第5个元素,您可以采用第二个参数的开头:

?- length(A, 4), append(A, [Fifth|Rest], [a,b,c,d,e,f,g,h]).
A = [a, b, c, d],
Fifth = e,
Rest = [f, g, h].

这不是一个解决方案,而是一个有效的策略:

every_ith(I, In, [X|Ys]) :-
    N is I - 1,
    length(Prefix, N),
    append(Prefix, [X|Xs], In),
    every_ith(I, Xs, Ys).