假设我有以下列表:
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).
所以我想知道是否有人可以为我指出正确的方向,从列表中删除所有超集,或者甚至给出正确的谓词。