package Sets_of_Unknowns is
-- DESCRIPTION :
-- This package provides a data abstraction for dealing with
-- sets with a limited number of unknowns.
type Set is private;
-- CREATORS :
function Create ( n : natural ) return Set;
-- DESCRIPTION :
-- Creates a set which can contain n unknowns.
-- After this operation Dimension(s) = n.
function Create ( s : Set ) return Set;
-- DESCRIPTION :
-- Returns a new set with the same contents as the given one.
-- Note that s1 := s2 does only create a new name of the same set,
-- but does not create a new set.
-- CONSTRUCTORS :
procedure Add ( s : in out Set; i : in natural );
-- DESCRIPTION :
-- Adds the ith unknown to the set.
-- The set must be created and 1 <= i <= Dimension(s).
procedure Union ( s1 : in out Set; s2 : in Set );
function Union ( s1,s2 : Set ) return Set;
-- DESCRIPTION :
-- Constructs the union of two sets of equal dimension.
-- Either the result will be contained in s1, or a new set
-- will be constructed.
procedure Remove ( s : in out Set; i : in natural );
-- DESCRIPTION :
-- Removes the ith unknown from the set.
-- The set must be created and 1 <= i <= Dimension(s);
procedure Difference ( s1 : in out Set; s2 : in Set );
function Difference ( s1,s2 : Set ) return Set;
-- DESCRIPTION :
-- Constructs the difference s1\s2 of two sets of equal dimension.
-- Either the result will be contained in s1, or a new set
-- will be constructed.
procedure Intersection ( s1 : in out Set; s2 : in Set );
function Intersection ( s1,s2 : Set ) return Set;
-- DESCRIPTION :
-- Construct the intersection of two sets of equal dimension.
-- Either the result will be contained in s1, or a new set
-- will be constructed.
-- SELECTORS :
function Dimension ( s : Set ) return natural;
-- DESCRIPTION :
-- Returns the number of unknowns the set can contain.
-- For an empty set, Dimension(s) = 0.
function Extent_Of ( s : Set ) return natural;
-- DESCRIPTION :
-- Returns the number of unknowns the set contains.
function Is_In ( s : Set; i : natural ) return boolean;
-- DESCRIPTION :
-- Returns true if the ith unknown belongs to the set.
function Is_Subset ( s1,s2 : Set ) return boolean;
-- DESCRIPTION :
-- Returns true when the set s1 is a subset of s2.
function Is_Equal ( s1,s2 : Set ) return boolean;
-- DESCRIPTION :
-- Returns true when the two sets have the same dimension
-- and the same elements.
generic
with procedure Process ( sub : in Set; continue : out boolean );
procedure Generate_Subsets ( s : in Set; k : in positive );
-- DESCRIPTION :
-- Generates all proper subsets with k elements of the set s.
-- Each time a new subset is found, Process is called, with the
-- subset as input parameter. When the output parameter continue
-- is set to false, the iteration stops. Otherwise it continues.
-- NOTE :
-- The same subset will be used over and over. If necessary,
-- copies should be taken when processing the subset.
generic
with procedure Process ( sub : in Set; continue : out boolean );
procedure Generate_All_Subsets ( s : in Set );
-- DESCRIPTION :
-- Generates all nonempty subsets of the set s, the set s included.
-- As above, the procedure Process allows the processing of a subset.
-- DESTRUCTOR :
procedure Clear ( s : in out Set );
-- DESCRIPTION :
-- Frees all occupied memory of the given set.
-- After Clear(s), Dimension(s) = 0.
private
type Set_Rep;
type Set is access Set_Rep;
end Sets_of_Unknowns;