Consider the following macro path involving a concatenator:
As we said earlier, concatenators of the form used above are so regular and occur so frequently that they might be represented by another simpler mechanism, called distributors. The distributor equivalent to the above concatenator is simply:
assuming that the collective name deposit has been previously
declared, for example by the collectivisor
. The distributors do not generate indices explicitly,
like the concatenators, but generate indices defined by the
corresponding collectivisors.
The syntax for the distributor is:
Recall that every collectivisor defines not only a set of indexed events but also a total order between them. For example the collectivisor:
states that the collective name c corresponds to the ordered indexed events set
and the collective name b corresponds to the ordered indexed events set
For every collective name a declared by a collectivisor, let
denote the total order of indexed events corresponding to
a. More formally
where
is a
set of corresponding indexed events, and
is a sharp total order (i.e.
is a total order).
For instance, for the collective name c declared by the
collectivisor C4 we have
, and
.
Suppose that a collective name a has k dimensions, i.e., every
indexed
event defined by a is of the form
,
for some
.
A total order
is called an array-slice of a
if and only if either
, or
satisfies the
following conditions
is an array slice of b from the collectivisor C4. In this case
we have r=1,
,
.
Array slices will be represented by slice events. Slice events will be represented like indexed events, but leaving blank the index fields corresponding to the indices which are not the same for all elements of the corresponding array slice.
In particular, the slice event corresponding to the whole set of
indexed
events defined by a collective name a, will be represented by
either a,
or
, or
.
In the case of the collective name c defined by the collectivisor C4 we have only one array slice, the whole set of indexed events:
which may be represented either by slice event c or by slice
event
.
The collective name b defined by the same collectivisor C4 has 3
dimensions,
and we may define 19 array slices and corresponding slice events in
this case.
For example
or b correspond to:
corresponds to
corresponds to
(in this case
r=2,
,
,
,
), etc.
The dimensions corresponding to blank fields of a slice event are
called
the distributable dimensions
of the corresponding array slice.
For instance
has 2 distributable dimensions: first and
third.
In principle, the slice events are strings
of the form
where some
's are
blank.
In particular a alone may be regarded as a shorthand for
. If
is blank we shall write
. Let
be a slice event with
. Hence j is a distributable dimension of
.
A slice event or indexed event
is called a section of slice event
generated by the distributable
dimension j
if
.
If a slice event has only one distributable dimension then all its
sections
are indexed events, otherwise they are slice events with one
distributable
dimension less. A distributable dimension j of a slice event
may, and usually does, generate more than
one section,
for instance, for the collective name b of the collectivisor C4,
the
distributable dimension number 1 of
generates two
sections:
and
.
A distributor operates on a specific distributable dimension of each slice event in its macro sequence, which after the expansion of the distributor ceases to be distributable. We shall refer to them as the current distributable dimensions of slice events. The slice events will be replaced upon the expansion of the distributor by corresponding sections of slice events.
The simplest distributor, called the simple distributor, has the form:
In this case it is assumed that for every slice event occurring in msequence, the current distributable dimension is that distributable dimension which is furthest to the right, For instance in the distributor D1
the 3rd dimension of b is the current distributable dimension.
The general syntax for distributors (see M.9) is
. So far we considered the case where both dim
and range are blanks. Let us now consider the case where range
is not blank. This case extends the class of regularities which the
distributors may generate by permitting them to distribute not only
over the whole range of array-slices but over a subrange of them as
well.
So now we have:
in which
,
,
denote integer expressions,
representing the subrange over which msequence is to be
distributed.
Suppose that the distributor:
, where sep and
msequence are the same as in D2 expands to:
where msequence(i) results from msequence by replacing all slice events by the appropriate ith sections of current distributable dimensions. Then distributor D2 will expand to:
where
, i.e., m is the greatest
integer such
that
,
where n is the number of copies to be selected.
For example, the distributor D3:
where c is declared by C4 would expand to:
selecting out of all copies of c in the string generated by the expansion of ;[c] only the first, second and third. The distributor D4:
would expand to:
selecting the first and the third copies of c in the expansion of ;[c].
We must specify which of the nested distributors applies to which of the distributable dimensions of array slices. The rule adopted so far is that the outermost distributor will apply to the rightmost distributable dimension of each slice; the second outermost to the rightmost not allocated distributable dimension, etc. A possible relaxation of the above rule would be to consider it as the default rule, and specify explicitly which separator applies to which distributable dimension, which is the case when dim of rule M9 is not a blank. The distributor D5, for example:
where b is defined by C5, where
, would
expand according to either rules to:
with ``,'' applying to the first dimension of b and ``;'' to the second. But D6:
would expand to :
since it is explicitly specified that ``;'' applies to the first dimension of b, and implicitly that ``,'' applies to the rightmost unallocated dimension of b, according to the default rule.
Similar to the other rules, the distributors must satisfy their own restrictions Drest1, Drest2.1, Drest2.2, Drest3, Drest4, Drest5.1 and Drest5.2 which are given as follows: