====================================================================
Multiset examples
====================================================================

The domain Multiset(R) is similar to Set(R) except that multiplicities
(counts of duplications) are maintained and displayed.  Use the
operation multiset to create multisets from lists.  All the standard
operations from sets are available for multisets.  An element with
multiplicity greater than one has the multiplicity displayed first,
then a colon, and then the element.

Create a multiset of integers.

  s := multiset [1,2,3,4,5,4,3,2,3,4,5,6,7,4,10]
    {1,2: 2,3: 3,4: 4,2: 5,6,7,10}
                          Type: Multiset PositiveInteger

The operation insert! adds an element to a multiset.

  insert!(3,s)
    {1,2: 2,4: 3,4: 4,2: 5,6,7,10}
                          Type: Multiset PositiveInteger

Use remove! to remove an element.  If a third argument is present, it
specifies how many instances to remove. Otherwise all instances of the
element are removed.  Display the resulting multiset.

  remove!(3,s,1); s

    {1,2: 2,3: 3,4: 4,2: 5,6,7,10}
                          Type: Multiset PositiveInteger

  remove!(5,s); s
    {1,2: 2,3: 3,4: 4,6,7,10}
                          Type: Multiset PositiveInteger

The operation count returns the number of copies of a given value.

  count(5,s)
    0
                          Type: NonNegativeInteger

A second multiset.

  t := multiset [2,2,2,-9]
    {3: 2,- 9}
                          Type: Multiset Integer

The union of two multisets is additive.

  U := union(s,t)
    {1,5: 2,3: 3,4: 4,6,7,10,- 9}
                          Type: Multiset Integer

The intersect operation gives the elements that are in common, with
additive multiplicity.

  I := intersect(s,t)
    {5: 2}
                          Type: Multiset Integer

The difference of s and t consists of the elements that s has but t
does not.  Elements are regarded as indistinguishable, so that if s
and t have any element in common, the difference does not contain that
element.

  difference(s,t)
    {1,3: 3,4: 4,6,7,10}
                          Type: Multiset Integer

The symmetricDifference is the union of difference(s, t) and difference(t, s).

  S := symmetricDifference(s,t)
    {1,3: 3,4: 4,6,7,10,- 9}
                          Type: Multiset Integer

Check that the union of the symmetricDifference and the intersect
equals the union of the elements.

  (U = union(S,I))@Boolean
    true
                          Type: Boolean

Check some inclusion relations.

  t1 := multiset [1,2,2,3]; [t1 < t, t1 < s, t < s, t1 <= s]
    [false,true,false,true]
                          Type: List Boolean

See Also:
o )show Multiset

