我有一个问题,我有这样的列表:
[[el1, el2, el3],
[el4, el5, el6],
[[el7, el8, el9], [el10, el11, el12], ..... , [elxx, elyy, elzz]],
[el, el, el]...]]
我想模式匹配列表的内部列表,
[el7, el8, el9], [el10, el11, el12], ..... , [elxx, elyy, elzz]
如何做到这一点?
截至目前,我使用
模式匹配其他元素my_method([[El1, El2, El3] | Rest]).
更新
如果列表的下一项是列表列表,我想模式匹配 - 我将遍历此列表,逐项删除项目。可以有任意数量的列表列表,它们可以包含任意数量的项目。它们还可以包含列表列表。实际上,每当我遇到列表列表时,我都会以递归方式调用相同的处理方法。
所有底层列表都有三个元素,但这些元素可能不同:
[1,p,neg(5,6)] [5,neg(7,6),假设]
答案 0 :(得分:1)
您可以使用类似于以下内容的谓词。
qualify([], []).
qualify([H|T], [HN|TN]) :- qualify_one(H, HN), qualify(T, TN).
qualify_one([H|_], N) :- qualify_one(H, N1), N is N1 + 1, !.
qualify_one(_, 0).
qualify
对列表中的每个成员所做的是找出“不是列表”,“简单列表”,“列表列表”的等级,...它是基于第一项。
示例:
?- qualify([1,[2,3,3],[[4,5,6], [7,8,9]]], NS).
NS = [0, 1, 2].
答案 1 :(得分:1)
你说“我将迭代这个列表,删除项目之后的项目”,所以这里的代码就是这样,假设“item”是一个非元素列表的三元素列表。
nested_member(X,X) :-
X = [A,_,_],
\+ is_list(A).
nested_member(X,[L|_]) :-
nested_member(X,L).
nested_member(X,[_|L]) :-
nested_member(X,L).
这可以用来回溯“项目”:
?- nested_member(X,[[el1, el2, el3], [el4, el5, el6],
[[el7, el8, el9], [el10, el11, el12],[elxx, elyy, elzz]]]).
X = [el1, el2, el3] ;
X = [el4, el5, el6] ;
X = [el7, el8, el9] ;
X = [el10, el11, el12] ;
X = [elxx, elyy, elzz] ;
false.
我想要,您甚至可以找到列表中找到项目的深度:
nested_member(X,L,D) :-
nested_member(X,L,0,D).
nested_member(X,X,D,D) :-
X = [A,_,_],
\+ is_list(A).
nested_member(X,[L|_],D0,D) :-
D1 is D0+1,
nested_member(X,L,D1,D).
nested_member(X,[_|L],D0,D) :-
nested_member(X,L,D0,D).