prolog中的集合操作

时间:2011-05-28 16:58:05

标签: prolog

我有研讨会论文,我必须在Prolog中找到一些集合的操作,例如子集:

subset([],V).
subset([H|T1],[H|T2]):-subset(T1,T2).
subset([H1|T1],[H2|T2]):- lt(H2,H1),subset([H1|T1],T2).

我很难找到其中的一些,所以如果有人写下来我会非常感激:

  • 检查元素是否为set
  • 的成员
  • 检查设置是否为空,el的数量 在集合
  • 检查是否所有el都是 编号
  • 检查两组是否相同

2 个答案:

答案 0 :(得分:2)

查看SWI-Prolog手册中的library(lists): List Manipulation部分。尝试列出那里列出的特定于集合的谓词,并使用listing/1检查其源代码,例如

?- listing(subset).
lists:subset([], _) :- !.
lists:subset([A|C], B) :-
    memberchk(A, B),
    subset(C, B).

集合表示为列表,因此要检查成员是否使用member/2,检查集合是否为空,请检查它是否与空列表统一。要检查集合元素的性质,例如要查看是否所有数字,您可以使用maplist

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

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

答案 1 :(得分:1)

在Prolog中,set通常由list表示。所以你的第一个列出的操作是列表上的member/2谓词,第二个只是检查集合是否为空列表。一些重要的集合理论操作是:

    集合A的
  • 联合和集合B:给出包含A或B中元素的集合。
  • A和B的
  • 交叉点:给出一个包含A和B中元素的集合。
  • A和B的
  • 差异:给出一个包含A中而不是B中的元素的集合。

其中一些操作是标准操作,例如,union/3intersection/3的描述在Kaarel的链接中。关于集合操作及其在Prolog中的实现的一些很好的讨论可以在这里找到:http://kti.mff.cuni.cz/~bartak/prolog/sets.html