Prolog问题,操作列表

时间:2019-03-15 07:10:18

标签: prolog

我是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中实现呢?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

首先,SWI已经有了谓词来检查列表是否“包含”(就集合包含而言)在另一个列表subset/2http://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