2013-10-10 29 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]. 

切割使谓词具有确定性。最后一条的削减是没有必要的。