模式匹配列表列表

时间:2010-10-24 11:21:20

标签: prolog

我有一个问题,我有这样的列表:

[[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),假设]

2 个答案:

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