我在Prolog中遇到问题,我有一个包含81个项目的列表,每次我需要从不同的位置获取9个项目,例如,如果我的列表是:
L=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],
split(L1,2,L) the result will be L1=[10,11,12,13,14,15,16,17,18].
我的程序是
split([X,X1,X2,X3,X4,X5,X6,X7,X8], 0, [X,X1,X2,X3,X4,X5,X6,X7,X8], []).
split([X,X1,X2,X3,X4,X5,X6,X7,X8|Y], 1, [X,X1,X2,X3,X4,X5,X6,X7,X8], Y).
split([X,X1,X2,X3,X4,X5,X6,X7,X8|Y], N, [X,X1,X2,X3,X4,X5,X6,X7,X8|T], Z) :-
N > 0,
N1 is N-1,
split(Y, N1, T, Z).
但它不起作用。
答案 0 :(得分:3)
您可以使用length/2
创建列表的功能,以及append/3
来拆分列表。基本上是:
extract(List, N, Len, E)
为真,位于 N (基于0的索引)中< em>列表
extract(List, N, Len, E) :-
length(E, Len),
length(Before, N),
append(Before, Rest, List),
append(E, _, Rest).
当然还有很多其他方法可以做到,但这在概念上很容易(至少对我而言)。
对于您的完全问题,您可以写:
extract_list(List, Len, Nth, E) :-
length(E, Len),
LenBefore is Len*(Nth-1),
length(Before, LenBefore),
append(Before, Rest, List),
append(E, _, Rest).
我已经切换了参数的位置,因为约定首先是输入参数,最后是输出。
答案 1 :(得分:1)
代码的最小编辑修补程序是
split([X,X1,X2,X3,X4,X5,X6,X7,X8], 1, [X,X1,X2,X3,X4,X5,X6,X7,X8|_]).
split(Y, N, [_X,_X1,_X2,_X3,_X4,_X5,_X6,_X7,_X8|Z]):-
N>1, N1 is N-1, split(Y, N1, Z).
如果原始列表的长度小于9*N
,则对于通话split(Y,N,....)
,此操作无效。