我正在尝试从gprolog中的列表列表中创建一个子列表。假设我有一个这样的列表:
List = [[q,1,3], [q,2,7], [r,3,2], [r,8,7]]
我想做一个仅以'q'开头的元素的子列表。
我尝试过
delete([r,_,_],List, NewList)
但是它似乎不起作用。我确定我缺少一些简单的东西,但是我对gprolog还是陌生的,对它不太熟悉。
答案 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).