prolog - 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]
contains[a,c]
和[a,d,e]
contains [a,d]
。
如何在 SWI-Prolog 中实现这一点?任何帮助表示赞赏。
解决方案
首先,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).
读作:remove
List
fromLists
如果它是 a member
ofLists
并且还有另一个(由 确认\=
)member
of Lists
(call it Sublist
),它是 a subset
of 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).
让这些列表Remaining
来自Lists
哪些是member
原始列表的 s 而Lists
不是 ( \+
) 是remove
d。
?- remaining([[a,b,c], [a,c], [a,d], [a,d,e]], Remaining).
Remaining = [[a, c], [a, d]].
推荐阅读
- c# - 通过优先合并其他三个来创建对象(C# .NET 3.5)
- java - 将代码从php转换为java。我转换了大部分代码,但我仍然遇到一些错误
- sql - 为了以不同的查询定义采用不同的参数的方式实施 MS Access Report,需要采取哪些步骤?
- java - GSON:如何从 json 解码为忽略对象的模型?
- bigdata - matillion和apache气流之间的区别
- node.js - 从嵌入式 MongoDB 文档中的数组中提取对象
- java - 识别唯一的字符串
- java - 我有一个回收站视图,onRun 会显示,但是单击按钮后它将为空,我想设置一个默认的回收站视图
- java - 使用正则表达式查找括号之间的任意数量的字符?
- sql - 将来自 2 个不同表的 A 列中具有相同值的 P 列中的所有值相加