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