我有这个清单:
C = [[1,0],[2,3],[1,2],[1,3]]
我想查找数字 1 是否包含在我的列表中位置 [1,_] 的子列表中,并且我想将 X ..... [1,X] 的数量保存到列表 Newlist 中。
我将举一个例子......我有列表C,我正在搜索第一个元素为1的子列表并给我Newlist。
新列表必须是:Newlist=[0,2,3]
它具有子列表的第二个元素,第一个元素的数字为 1。
我有这个清单:
C = [[1,0],[2,3],[1,2],[1,3]]
我想查找数字 1 是否包含在我的列表中位置 [1,_] 的子列表中,并且我想将 X ..... [1,X] 的数量保存到列表 Newlist 中。
我将举一个例子......我有列表C,我正在搜索第一个元素为1的子列表并给我Newlist。
新列表必须是:Newlist=[0,2,3]
它具有子列表的第二个元素,第一个元素的数字为 1。
如果您将 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).
你需要一个“过滤器”。这就是它的样子:
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].
削减使谓词具有确定性。最后一个子句中的删减是不必要的。
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)