我有这个清单:
C = [[1,0],[2,3],[1,2],[1,3]]
我想知道我的列表中的子列表中的数字1是否包含在位置[1,_]中,并且我想保存到列表中新列表X的数量..... [1,X]。
我将给出一个例子......我有列表C,我正在搜索第一个元素为1的子列表并给我新的列表。
新名单必须为:Newlist=[0,2,3]
它有第一个元素的数字为1的子列表的第二个元素。
答案 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)