prolog中的集合运算

prolog中的集合运算,prolog,Prolog,我有一篇研讨会论文,其中我必须在Prolog中找到一些关于集合的运算,例如子集: subset([],V). subset([H|T1],[H|T2]):-subset(T1,T2). subset([H1|T1],[H2|T2]):- lt(H2,H1),subset([H1|T1],T2). 我很难找到其中的一些,所以如果有人写下来,我会非常感激: 检查元素是否为集合的成员 检查集合是否为空,el编号 现场 检查机组的所有el是否正常工作 数字 检查两套是否相同 查看SWI Prolog

我有一篇研讨会论文,其中我必须在Prolog中找到一些关于集合的运算,例如子集:

subset([],V).
subset([H|T1],[H|T2]):-subset(T1,T2).
subset([H1|T1],[H2|T2]):- lt(H2,H1),subset([H1|T1],T2).
我很难找到其中的一些,所以如果有人写下来,我会非常感激:

  • 检查元素是否为集合的成员
  • 检查集合是否为空,el编号 现场
  • 检查机组的所有el是否正常工作 数字
  • 检查两套是否相同
查看SWI Prolog手册中的部分。尝试此处列出的set-specific谓词,并使用
listing/1
检查它们的源代码,例如

?- listing(subset).
lists:subset([], _) :- !.
lists:subset([A|C], B) :-
    memberchk(A, B),
    subset(C, B).
集合表示为列表,因此要检查成员,请使用
member/2
;要检查集合是否为空,请检查集合是否与空列表相统一。要检查集合元素的性质,例如查看是否所有元素都是数字,您可以使用
地图列表

?- maplist(number, [1, -1.2, 0]).
true.

如果两个集合是彼此的子集,则它们是等价的。

在Prolog中,集合通常用列表表示。因此,您列出的第一个操作是列表上的
成员/2
谓词,第二个操作只是检查集合是否为空列表。一些重要的集合论运算包括:

  • 集合A和集合B的并集:给出一个集合,其中包含A或B中的元素
  • A和B的交集:给出一个包含A和B中元素的集合
  • A和B的差异:给出一个包含A中元素而不包含B中元素的集合
其中一些操作是标准操作,例如,
union/3
intersection/3
的描述在Kaarel的链接中。关于集合操作及其在Prolog中的实现的一些很好的讨论可以在这里找到: