Шаблон сопоставления списков списков - PullRequest
1 голос
/ 24 октября 2010

У меня проблема с тем, что у меня есть такой список:

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

UPDATE

Я хочу сопоставить шаблон, если следующим элементом списка является список списков - я буду перебирать этот список, удаляя элемент за элементом. Может быть любое количество списков списков, и они могут содержать любое количество элементов. Они также могут содержать списки списков. Фактически, я буду рекурсивно вызывать один и тот же метод обработки всякий раз, когда сталкиваюсь со списком списков.

Все списки нижнего уровня будут иметь три элемента, однако эти элементы могут отличаться:

[1, р, нег (5,6)] [5, отрицание (7,6), предположение]

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Вы сказали: «Я буду перебирать этот список, удаляя элемент за элементом», поэтому вот код, который делает именно это, предполагая, что «элемент» - это трехэлементный список не-списков.

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).
1 голос
/ 24 октября 2010

Вы можете использовать предикаты, подобные следующим:

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].
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...