1

我有这个清单:

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

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

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

新列表必须是:Newlist=[0,2,3]

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

4

3 回答 3

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).
于 2013-10-11T08:38:02.090 回答
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].

削减使谓词具有确定性。最后一个子句中的删减是不必要的。

于 2013-10-11T06:57:38.917 回答
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)
于 2013-10-11T11:55:55.887 回答