2013-10-10 57 views
1

我有這樣的名單:我的列表創建與子列表的元素newlist

C = [[1,0],[2,3],[1,2],[1,3]] 

我會喜歡發現如果包括在我的位置列表中的子列表數目1 [1,_]和我喜歡保存到一個列表新的列表X的數量..... [1,X]。

我舉一個例子...我有列表C和我正在尋找子列表,其第一個元素是1,給我的Newlist。

的Newlist必須是:Newlist=[0,2,3]

它有誰擁有的第一個元素的數字1的子列表的第二個元素。

+2

你可以在這個問題上顯示一個嘗試嗎?首先嚐試從邏輯上表達解決方案在不同條件下的樣子。例如,如果你調用謂詞'select_list',那麼你可以說,''select_list'是一個空列表。 – lurker

回答

1

nth0/3允許通過索引來訪問列表」的元素:

?- C = [[1,0],[2,3],[1,2],[1,3]], findall(P, nth0(P, C, [1,_]), NewList). 
C = [[1, 0], [2, 3], [1, 2], [1, 3]], 
NewList = [0, 2, 3]. 

編輯對不起,我沒看問題的權利。第nth0是誤導。可以改爲

findall(E, member([1,E], C), NewList) 
+1

這個答案是誤導性的,並給出了符合預期的答案。原始問題中沒有任何內容說明子列表的第二個元素也會成爲列表中子列表的從0開始的索引。 – 2013-10-12 04:31:01

+0

哎呀,你說得對,我沒有讀好這個問題... – CapelliC

1

你需要一個 「過濾器」。這是可能的樣子:

filter_1_at_pos_1([], []). % The new list is empty when the input list is empty 
filter_1_at_pos_1([[1,X]|Sublist], [X|Xs]) :- % The first element is 1 so the 
               % second element belongs to the 
               % new list 
    !, filter_1_at_pos_1(Sublist, Xs). % filter the remainder of the list 
filter_1_at_pos_1([[N,_]|Sublist], Xs) :- 
    N \== 1, % The first element is not 1, ignore the second element 
    !, filter_1_at_pos_1(Sublist, Xs). 

由於@mbratch建議,只是定義爲每個可能的條件的輸入列表中的一個元素的溶液,在這種情況下1)空表2)第一個元素是1, 3)第一個元素不是1.

?- C = [[1,0],[2,3],[1,2],[1,3]], filter_1_at_pos_1(C, NewList). 
C = [[1, 0], [2, 3], [1, 2], [1, 3]], 
NewList = [0, 2, 3]. 

切割使謂詞具有確定性。最後一條的削減是沒有必要的。