Допустим, у меня есть следующий список:
List = [[a],[a,b],[a,c],[b,c],[b,d],[a,b,c],[a,b,d],[b,c,e],[b,d,e,f]]
Цель состоит в том, чтобы удалить каждый список в списке, который является надмножеством списка в списке.
Список, содержащий списки, всегда имеет следующие свойства:
- Списки в списке отсортированы по длине
- Каждый список в списке отсортирован
Моя первоначальная идея заключалась в том, чтобы просто начать с первого списка в списке, пройтись по всем остальным спискам и удалить списки, которые являются надмножеством. Затем я бы посмотрел на второй список и так далее.
После удаления всех надмножеств списка [a] он должен выглядеть так:
List = [[a],[b,c],[b,d],[b,c,e],[b,d,e,f]]
Затем следует удалить надмножества [b,c]:
List = [[a],[b,c],[b,d],[b,d,e,f]]
Последнее - это надмножества [b, d]:
List = [[a],[b,c],[b,d]]
И строка выше должна быть результатом.
Я уже сделал предикат, похожий на предикат члена, но вместо того, чтобы брать один элемент и сравнивать его со списком, он берет весь список и сравнивает его со списком:
memberList([],_).
memberList([X|Xs],Y) :-
member(X,Y),
memberList(Xs,Y).
Это работает только со списками.
?- memberList(a,[a,b,c]).
false.
?- memberList([a],[a,b,c]).
true .
?- memberList([a,b],[a,b,c]).
true .
Но после этого я немного потерялся.
Я попробовал следующее, которое должно удалить суперсеты одного набора, но это не сработало:
removeSupersetsList(_,[],[]).
removeSupersetsList(X,[Y|Ys],[Y|Out]) :-
not(memberList(X,Y)),
removeSupersetsList(X,Ys,Out).
removeSupersetsList(X,[Y|Ys],Out) :-
memberList(X,Y),
removeSupersetsList(X,Ys,Out).
Поэтому мне было интересно, может ли кто-нибудь указать мне правильное направление, чтобы удалить все надмножества из списка или, может быть, даже дать правильный предикат.