通过我的列表创建包含子列表元素的新列表

时间:2013-10-10 22:46:00

标签: prolog

我有这个清单:

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

我想知道我的列表中的子列表中的数字1是否包含在位置[1,_]中,并且我想保存到列表中新列表X的数量..... [1,X]。

我将给出一个例子......我有列表C,我正在搜索第一个元素为1的子列表并给我新的列表。

新名单必须为:Newlist=[0,2,3]

它有第一个元素的数字为1的子列表的第二个元素。

3 个答案:

答案 0 :(得分:2)

如果你将SWI-Prolog与模块lambda.pl一起使用,(你可以在http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl找到它)你可以写

:- use_module(library(lambda)).

my_filter(V, L, R) :-
   foldl(V+\X^Y^Z^(X = [V,W]
           ->  append(Y, [W], Z)
           ;   Z = Y),
      L, [], R).

答案 1 :(得分: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].

削减使谓词具有确定性。最后一句中的裁减是没有必要的。

答案 2 :(得分: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)