我是Prolog的新手,有一个问题:
假设我有一个列表列表; [list1, list2, list3,..., list_n]
如果list_j
包含list_i
,即list_i
中的每个变量都在list_j
中出现,则删除list_j
。
例如,如果输入为
[[a,b,c], [a,c], [a,d], [a,d,e]]
输出应为
[[a,c], [a,d]]
因为[a,b,c]
包含[a,c]
,而[a,d,e]
包含[a,d]
。
如何在SWI-Prolog中实现呢?任何帮助表示赞赏。
答案 0 :(得分:1)
首先,SWI已经有了谓词来检查列表是否“包含”(就集合包含而言)在另一个列表subset/2
(http://www.swi-prolog.org/pldoc/man?predicate=subset/2)中。
现在您可以使用它来检查是否从所有列表中删除特定列表:
remove(Lists, List) :-
member(List, Lists),
member(Sublist, Lists),
Sublist \= List,
subset(Sublist, List).
读取为:{{1}中的remove
List
,如果它是Lists
的{{1}},并且还有另一个(由member
确认) ),即{{1}的Lists
(称为\=
),它是member
的{{1}}。
Lists
现在您可以使用它来回答您的原始问题:
Sublist
让这些列表成为{{1}中的subset
,它们是List
原始列表中的?- remove([[a,b,c], [a,c], [a,d], [a,d,e]], L).
L = [a, b, c] ;
L = [a, d, e] ;
,而不是{remaining(Lists, Remaining) :-
bagof(List,
(
member(List, Lists),
\+ remove(Lists, List)
),
Remaining).
)为{{ 1}} d。
Remaining