拆分列表问题

时间:2013-06-06 08:22:22

标签: list prolog

我在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).

但它不起作用。

2 个答案:

答案 0 :(得分:3)

您可以使用length/2创建列表的功能,以及append/3来拆分列表。基本上是:

E Len 的长度 Len 列表时,

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,....),此操作无效。