/*
Some set predicates in Picat.
Port of the B-Prolog code
http://www.sci.brooklyn.cuny.edu/~zhou/teaching/cis2210/set.pl
"""
by Neng-Fa Zhou, January 2012
These predicates in B-Prolog (www.probp.com) implement the set operations
covered in my Discrete Structures class. As the students are not yet familiar
with recursion, no recursion is used except for power/2.
"""
This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com
See also my Picat page: http://www.hakank.org/picat/
*/
module set_util.
% main => test.
test =>
A = [X : X in 0..11],
B = [X : X in 0..18, X mod 2 == 0],
write('A='),writeln(A),
write('B='),writeln(B),
AuB=union(A,B), writeln($union(AuB)),
AiB=intersection(A,B), writeln($intersection(AiB)),
AmB=difference(A,B),writeln($difference(AmB)),
AxB=xor(A,B),writeln($xor(AxB)),
C = [1,2,3,4],
D = [4,5,6],
Power=power(C),writeln($power(Power)),
Product=product(C,D),writeln($product(Product)),
E = [2,3],
if subset(E,C) then printf("%w is a subset of %w\n", E,C) end,
nl.
% test if A is a subset of B
subset(A,B)=>
foreach(X in A) membchk(X,B) end.
% test if A is a proper subset of B
proper_subset(A,B)=>
subset(A,B),
once((member(X,B), not member(X,A))).
% test if sets A and B are equal
equal(A,B)=>
subset(A,B),
subset(B,A).
% C is the union of A and B
union(A,B) = C =>
bp.sort(A++B,C). % eliminate duplicates
% C is the intersection of A and B
intersection(A,B) = C =>
C = [X : X in A, membchk(X,B)].
% C is the relative complement of A w.r.t. B (A-B)
difference(A,B) = C =>
C = [X : X in A, not member(X,B)].
% C is the exclusive or of A and B.
xor(A,B) = C =>
C = [X : X in A, not member(X,B)] ++ [X : X in B, not member(X,A)].
% P is the product of A and B
product(A,B) = P =>
P = [(X,Y) : X in A, Y in B].
% P is the power set of A
power([]) = [[]].
power([H|T]) = P1++P2 =>
P1 = power(T),
P2 = [[H|S] : S in P1].