我有研讨会论文,我必须在Prolog中找到一些集合的操作,例如子集:
subset([],V).
subset([H|T1],[H|T2]):-subset(T1,T2).
subset([H1|T1],[H2|T2]):- lt(H2,H1),subset([H1|T1],T2).
我很难找到其中的一些,所以如果有人写下来我会非常感激:
答案 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
谓词,第二个只是检查集合是否为空列表。一些重要的集合理论操作是:
其中一些操作是标准操作,例如,union/3
和intersection/3
的描述在Kaarel的链接中。关于集合操作及其在Prolog中的实现的一些很好的讨论可以在这里找到:http://kti.mff.cuni.cz/~bartak/prolog/sets.html。