从列表列表中选择子列表

问题描述 投票:0回答:3

我正在尝试从gprolog中的列表列表中创建一个子列表。说我有一个这样的列表:

List = [[q,1,3], [q,2,7], [r,3,2], [r,8,7]]

我只想让以'q'开头的元素成为子列表。

我尝试过

delete([r,_,_],List, NewList)

但是它似乎不起作用。我确定我缺少一些简单的东西,但是我对gprolog还是陌生的,对它不太熟悉。

list prolog
3个回答
1
投票

此解决方案仅检查列表是否以'q'开头

f([], []).
f([[q|X]|T1], [[q|X]|T2]) :- !,  f(T1, T2).
f([_|T], X) :- f(T,X).

我假设您想要更灵活的东西,类似于您尝试过的东西,我会做这样的事情:

pick(_, [], []).
pick(P, [[P|X]|T1], [[P|X]|T2]) :- !,  pick(P, T1, T2).
pick(P, [_|T], X) :- pick(P,T,X).

这样

?- pick(r, [[q,1,3], [q,9,7], [r,3,2], [r,8,7]], Z).
  Z = [[r, 3, 2], [r, 8, 7]] .

?- pick(q, [[q,1,3], [q,9,7], [r,3,2], [r,8,7]], Z).
  Z = [[q, 1, 3], [q, 9, 7]] .

0
投票

我在下面附上我的方法。遍历列表,直到列表为空。如果头部带有“ q”,则将其添加到列表中。如果不存在,则什么也不要继续进行。

head(H,[H|_]).

sublist1([],[]).
sublist1([H|T],[H|Z]):- member(q,H) , head(q,H) , sublist1(T,Z).
sublist1([H|T],Z):- member(q,H) , \+head(q,H) , sublist1(T,Z).
sublist1([H|T],Z):- \+member(q,H) , sublist1(T,Z).

输出

| ?- sublist1([[q,1,3], [r,2,7], [r,3,2], [r,8,7]],X).

X = [[q,1,3]] ? ;

no
| ?- sublist1([[q,1,3], [q,2,7], [r,3,2], [r,8,7]],X).

X = [[q,1,3],[q,2,7]] ? ;

no
| ?- sublist1([[q,1,3], [q,2,7], [r,3,2], [q,8,7]],X).

X = [[q,1,3],[q,2,7],[q,8,7]] ? ;

no
?- sublist1([[q,1,3], [r,2,7], [r,q,2], [r,8,7]],X).
X = [[q, 1, 3]] ;
no

希望这就是您想要的。希望它对您有所帮助。


0
投票

您可以只使用findall/3

findall([q,A,B], member([q,A,B], List), Sublist)
© www.soinside.com 2019 - 2024. All rights reserved.