procedure display_set (s) writes ("[") every writes (!s || " ") write ("]") end # fail unless s1 and s2 contain the same elements procedure set_equals (s1, s2) return subset(s1, s2) & subset(s2, s1) end # fail if every element in s2 is not contained in s1 procedure subset (s1, s2) every (a := !s2) do { if not(member(s1,a)) then fail } return s2 end procedure main () a := set(1, 1, 2, 3, 4) b := set(2, 3, 5) writes ("a: ") display_set (a) writes ("b: ") display_set (b) # basic set operations writes ("Intersection: ") display_set (a ** b) writes ("Union: ") display_set (a ++ b) writes ("Difference: ") display_set (a -- b) # membership if member(a, 2) then write ("2 is a member of a") else write ("2 is not a member of a") if member(a, 5) then write ("5 is a member of a") else write ("5 is not a member of a") # equality if set_equals(a, set(1,2,3,4,4)) then write ("a equals set(1,2,3,4,4)") else write ("a does not equal set(1,2,3,4,4)") if set_equals(a, b) then write ("a equals b") else write ("a does not equal b") # subset if subset(a, set(1,2)) then write ("(1,2) is included in a") else write ("(1,2) is not included in a") if subset(a, set(1,2,5)) then write ("(1,2,5) is included in a") else write ("(1,2,5) is not included in a") end