从列表列表中创建子列表

时间:2019-12-09 04:24:22

标签: list prolog

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

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

我想做一个仅以'q'开头的元素的子列表。

我尝试过

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

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

3 个答案:

答案 0 :(得分:1)

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

The program 'nodejs' is currently not installed. You can install it by typing
sudo apt install nodejs

如果您想要更灵活的东西,类似于您尝试过的东西,我会这样做:

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).

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

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

答案 2 :(得分:0)

您可以只使用findall/3

findall([q,A,B], member([q,A,B], List), Sublist)

如果要概括一下:

sublist_starting_with(E, List, Sublist) :-
    findall([E,A,B], member([E,A,B], List), Sublist).