2013-06-06 94 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很好地被發現。 :) –