# Aggregate¶

The notion of aggregate serves to model any data structure aggregate, designating any collection of objects, with heterogeneous or homogeneous members, with a finite or infinite number of members, explicitly or implicitly represented. An aggregate can in principle represent everything from a string of characters to abstract sets such as “the set of `x`

satisfying relation *r(x)*” An attribute finiteAggregate is used to assert that a domain has a finite number of elements.

- #: % -> NonNegativeInteger if % has finiteAggregate
`\#(u)`

returns the number of elements in`u`

.

- copy: % -> %
`copy(u)`

returns a top-level (non-recursive) copy of`u`

. Note: for collections,`copy(u) = [x for x in u]`

.

- empty: () -> %
`empty()`

$`D`

creates an aggregate of type`D`

with 0 elements. Note: The*$D*can be dropped if understood by context, e.g.`u: D := empty()`

.

- empty?: % -> Boolean
`empty?(u)`

tests if`u`

has 0 elements.

- eq?: (%, %) -> Boolean
`eq?(u, v)`

tests if`u`

and`v`

are same objects.

- less?: (%, NonNegativeInteger) -> Boolean
`less?(u, n)`

tests if`u`

has less than`n`

elements.

- more?: (%, NonNegativeInteger) -> Boolean
`more?(u, n)`

tests if`u`

has more than`n`

elements.

- sample: %
`sample yields`

a value of type %

- size?: (%, NonNegativeInteger) -> Boolean
`size?(u, n)`

tests if`u`

has exactly`n`

elements.