generic type base is (<>); package set_of is type set is private; type list is array (positive range <>) of base; empty, full : constant set; function make_set(x : list) return set; function make_set(x : base) return set; function decompose(x : set) return list; function "+"(x,y : set) return set; -- union function "*"(x,y : set) return set; -- intersection function "-"(x,y : set) return set; -- symmetric difference function "<"(x : base; y : set) return boolean; -- inclusion function "<="(x,y : set) return boolean; -- contains function size(x : set) return natural; -- number of elements private type set is array (base) of boolean; empty : constant set := (set'range => false); full : constant set := (set'range => true); end set_of; package body set_of is function make_set(x : list) return set is temp : set := empty; begin for index in x'range loop temp(x(index)) := true; end loop; return temp; end make_set; function make_set(x : base) return set is temp : set := empty; begin temp(x) := true; return temp; end make_set; function decompose(x : set) return list is t : list(1 .. size(x)); index : natural := 0; begin for b in base loop if x(b) then index := index + 1; t(index) := b; end if; end loop; return t; end decompose; function "+"(x,y : set) return set is t : set := x or y; begin return t; end "+"; function "*"(x,y : set) return set is t : set := x and y; begin return t; end "*"; function "-"(x,y : set) return set is t : set := x xor y; begin return t; end "-"; function "<"(x : base; y : set) return boolean is begin return y(x); end "<"; function "<="(x,y : set) return boolean is begin return (x and y) = x; end "<="; function size(x : set) return natural is s : natural := 0; begin for b in base loop if x(b) then s := s + 1; end if; end loop; return s; end size; end set_of; with text_io, set_of; use text_io; procedure test is type colours is (red, green, blue); package cset is new set_of(colours); use cset; a1 : list(1..2) := (red, blue); s1 : set := make_set(a1); s2 : set := make_set(green); procedure put(s : set) is l : list(1..size(s)) := decompose(s); begin text_io.put("{ "); for index in l'range loop text_io.put(colours'image(l(index)) & ' '); end loop; text_io.put('}'); end put;