2013-06-06 60 views
1

我在序言的问题,我有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

你是什么意思的“它不工作”?你得到一个错误?结果并不像预期的那样? – toro2k

+0

'2'在您的示例'split(L1,2,L)'中代表什么?通过“每次不同的位置”,你的意思是你想让它回溯并耗尽所有可能的选项,或者你是否计划通过一个不同的参数来请求不同的子列表?如果回溯,是否允许子列表重叠? – lurker

回答

3

您可以使用length/2创建列表以及append/3来分割列表。基本上:

extract(List, N, Len, E)为真时ë是从位置Ñ(基于0的索引)在列表长度莱恩列表

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

最小编辑修复您的代码是,如果原始列表的长度小于9*N

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

这不会工作了呼叫split(Y,N,....)

+2

我不确定它是否有效。第一条规则在输入列表中应该有一个尾部,然后它适用于任何长度(大于9)'split(.... X8 | _])。' – 2013-06-06 12:47:33

+0

@Boris很好地被发现。 :) –