2017-09-30 152 views
2

我有這樣的嵌套列表:跳過列表元素的列表

list = [[1, 2, 3, 4], 
     [2, 7, 2, 1], 
     [3, 3, 7, 5], 
     [4, 4, 1, 7]] 

而且我想跳過此嵌套列表的第一個列表,每個列表的第一個元素。我希望它變成了這個樣子:

list = [[7, 2, 1], 
     [3, 7, 5], 
     [4, 1, 7]] 

到目前爲止,我有這樣的:

% skip first list in list of lists 
skip_first_list([_|Tail], Tail). 

% attemping to skip first element in each of the lists 
skip_first_list([[_ | HeadTail] | Tail], X) :- 
    skip_first_list(Tail, R), 
    append(R, [HeadTail], X). 

不產生正確的結果:雖然我這個答案後,我

?- skip_first_list([[1, 2, 3, 4], [2, 7, 2, 1], [3, 3, 7, 5], [4, 4, 1, 7]], X). 
X = [[2, 7, 2, 1], [3, 3, 7, 5], [4, 4, 1, 7]] ; 
X = [[3, 3, 7, 5], [4, 4, 1, 7], [2, 3, 4]] ; 
X = [[4, 4, 1, 7], [7, 2, 1], [2, 3, 4]] ; 
X = [[3, 7, 5], [7, 2, 1], [2, 3, 4]] ; 
false. 

X = [[7, 2, 1], [3, 7, 5], [4, 1, 7]] 

我的結果到目前爲止似乎要顯示我正在追加反向/不正確的順序,我該如何解決這個問題?我不太瞭解Prolog評估表達式的順序。任何任何將不勝感激。

回答

3

那麼規範是您提供一個列表的列表,並指出:

  • 第一子列表被忽略(不是輸出的一部分);和
  • 對於其餘的子列表,所有的頭也被忽略。

所以我們最好分成兩個謂詞這樣的:

  • remove_heads/2,這將刪除所有子列表的負責人;和
  • remove_upper_left/2刪除第一個子列表,然後使用上面的謂詞來彈出子列表的頭部。

我們可以用遞歸例如執行remove_heads/2

remove_heads([],[]). 
remove_heads([[_|H]|T],[H|T2]) :- 
    remove_heads(T,T2). 

最後我們remove_upper_left/2簡單地忽略列表的頭部,並使得調用remove_heads用尾巴:

remove_upper_left([_|T],T2) :- 
    remove_heads(T,T2). 

或全部:

remove_heads([],[]). 
remove_heads([[_|H]|T],[H|T2]) :- 
    remove_heads(T,T2). 

remove_upper_left([_|T],T2) :- 
    remove_heads(T,T2). 

這然後產生:

?- remove_upper_left([[1, 2, 3, 4], [2, 7, 2, 1], [3, 3, 7, 5], [4, 4, 1, 7]],X). 
X = [[7, 2, 1], [3, 7, 5], [4, 1, 7]]. 

和在相反方向上工作,以及:因此,這裏

?- remove_upper_left(X, [[1, 2, 3, 4], [2, 7, 2, 1], [3, 3, 7, 5], [4, 4, 1, 7]]). 
X = [_G1364, [_G1370, 1, 2, 3, 4], [_G1376, 2, 7, 2, 1], [_G1382, 3, 3, 7, 5], [_G1388, 4, 4, 1|...]]. 

它預先考慮到每一個列表中的變量,並預置變量(可能一個子表)到輸出。

此外,我們在這裏有兩個謂詞,價格爲1:如果我們想要將列表中的所有子列表的頭部彈出,我們今後也可以使用remove_heads/2

相關問題