A little thought exercise I embarked upon.
Probably not very clearly expressed, and certainly of no practical use,
but I think there are some interesting ideas:
Why must the result of $y always be a vector? What would happen if we let
it be a higher-ranked array? What would that _mean_?
Well, say that 2 3 4-:$y. That means that y is a mapping from arrays x
that have the same shape as 2 3 4 (and whose elements are natural and
bounded by 2 3 4). In other words, if (x -:&$ 2 3 4) *. -. 0 e. x<2 3 4
then (<x){y is well-defined as an atom. (I am intentially ignoring the
possibility of sentences such as ((<1 1){y) ((<,1){y) ((<1){y) and so
on; consider these sentences ill-formed for the time being.)
Generalising: if (x -:&$ $y) *. -. 0 e. x<$y then (<x){y is well-defined
as an atom.
But this sentence makes no restrictions whatsoever on the rank of x! So
it would seem that we've discovered a way to make a y whose shape is an
array of any rank. But we must be careful. Really, all we've constructed
is a strange entity y--call it an array-as-we-do-not-know-it--and, on
arrays-as-we-do-not-know-them, we have defined that: $y is well-defined,
and evaluates to an array-as-we-know-it. x{y is well-defined for some
subset of arrays-as-we-know-them x, and evaluates to an
atom-as-we-know-it.
I will call this strange creature a 4th-order array. And all
arrays-as-we-know-them are 3rd-order (this includes scalars, vectors, and
higher-rank arrays). A 4th-order array has a shape which is a 3rd-order
array, and maps from 3rd-order arrays to atoms. This suggests the
existence of lower-order arrays, and higher-order ones.
Following the same logic, then, a 3rd-order array would map 2nd-order
arrays to atoms, and its shape would be a 2nd-order array. But--for
3rd-order y, the x in (<x){y for 3rd-order y is currently also a 3rd-order
array, and $y is currently also 3rd-order.
Or is it, really? We've already established that $y must always be a
vector for ordinary, familiar, 3rd-order y; and that x must be too for
(<x){y. (A vector is a 3rd-order array y which satisfies (,1)-:$$y.) I
propose that there is another strange creature, which is a 2nd-order
array, or _list_. This is no less strange than 4th-order array, and j
does not have them. A list is very similar to a vector, though, in that
it is an ordered sequence of atoms. And there is an obvious 1:1 mapping
between vectors and lists. Therefore, when you write (<x){y, and x is a
vector, it is first _converted_ to the corresponding list, and that list
is used to index y. Similarly, when you write $y, and y is a third-order
array, its shape is actually a list; that list is _converted_ to the
corresponding vector before being returned.
Then, fairly straightforwardly, we can define the 1st-order array, or
_atom_, another strange creature. Atoms are used to index lists, and the
shape of a list is an atom. And every atom (1st-order array) also has a
counterpart in familiar 3rd-order land, as a _scalar_. (A scalar is a
3rd-order array y which satisfies ((,0)$0)-:$y.)
The obvious difference between a vector and a list is that, if we want
element 5 of y, and y is a list, we write (<5){y; but if y is a vector, we
must write (<,5){y. But to make the distinction that way misses the
point, I think. A 2nd-order array is a particular sort of array which is
restricted in that it can only contain unidirectional sequences of atoms.
A vector is of a different sort of array, which is less restricted, but it
happens to belong to a particular subset which maps to lists. (The same
relationship holds for scalars and atoms.)
Now, imagine a hypothetical version of j which could represent arrays of
orders other than 3. It is difficult to talk about such a j, because--for
instance--there might be an atom value 3 and a scalar value 3, and these
would be distinct; if I simply write '3', it is ambiguous which is
referred to. So I will err on the side of verbosity rather than
ambiguity.
One thing immediately becomes clear: the result of $y in such a j should
be the _actual_ shape of y; that is, it should have order one lower than
y. What, then is the shape of an atom? It might be an error, but I
should rather make it the _unit_. The unit is the singular value which is
an order-0 array. The unit is also its own shape. Then, we can also say
that an order n array is one which requires n applications of $ to reach a
fixed point. Personally, I think a fixed point of a unit is nicer than a
fixed point of ,1 (which is what we currently have, with all results
squashed into 3rd-order arrays), but this is a point of style.
Another nice consistency that results is that the idiom $$y evaluates to
an atom when y is a 3rd-order array. That is, it gives you the rank of y,
rather than a 1-element vector containing the rank.
Another observation: this provides a way to relate j to k; the difference
between them is one of degree, not kind. In k, everything is a list or a
scalar; that is, all values have order 1 or order 2. In j, all values
have order 3. (There is another difference, which is that k has nests
where j has boxes, but this is orthogonal.)
We can think of 3rd-order arrays as functions; for instance, an array of
rank 4 is like a function of 4 parameters. If we index such an array
using a list of length 4, that is like applying the corresponding
function, where each element of the list is associated with the
corresponding argument. By convention, these functions are curried.
Even if y has rank 4, it is legal in j to write (<1 2 0){y, even though 1
2 0 has length 3. (Previously, I said I was considering this illegal;
now, I am defining it again.) This works by currying y; producing an
array which has its first 3 arguments fixed (to 1, 2, and 0,
respectively), requiring only 1 more; because it only requires 1 more
argument, we say it has rank 1. This works well enough for 3rd-order
arrays, but what about higher-order ones? When is something a valid
'partial index', and what are the 'first arguments'?
A better definition comes from , . If p is a valid index into y (as
defined in the 3rd paragraph), then (<p){y applies the indexing procedure
as usual. Otherwise, it is the array for which (<q){(<p){y is equivalent
to (<p,q){y. (This only holds if there is q for which, given p and y, p,q
is a valid index into y; otherwise it is an index error.) This is
adequate to describe existing indexing behaviour for 3rd-order arrays .
And it works without a hitch for 4th-order arrays. For higher-order
arrays, it is simply necessary to extend , to work on higher-order arrays;
given such an extension, that, too will work without a hitch (and probably
(?) give sensible results).
I think the foregoing definition goes most of the way towards explaining
why we may index arrays using scalars; it is more than a convenience
feature, and the scalar is not simply converted to a vector. (Going the
rest of the way would require a complete and general model of , .)
Now, some questions:
1. It there any practical value to this scheme? In some respects, an
array with a non-list shape just seems like an array with a list shape,
and bells on. But I am a low-dimensional creature, and perhaps if I had
more use for very high-dimensional arrays, I would find it useful to
structure my axes (and then structure the structure of my axes, and so on,
leading to arrays of ever higher orders).
The simplest 4th-order array which is 'interesting' has shape 2 2$2; that
is, it corresponds roughly to a 4-dimensional array; that is rare enough.
The simplest 5th-order array which is 'interesting' has shape (2 2$2)$2,
that is 16-dimensional-ish. I generally have little use for arrays of
such high dimension (4 is reasonable, 16 is quite unlikely), and have not
found a linear organization stifling or problematic.
The jump from the unit to the atom seems most significant, as it allows
you to communicate any information at all; the unit carries no
information. Next in significance is the jump from atoms to lists, which
permit the communication of inherently _structured_ information. This is
good enough for many applications (and k gets along just fine); moving to
3rd-order arrays simply increases the degree of structure available, which
can be useful in some (ok, many) situations. So it would not be
surprising if the added benefit of moving to higher orders continued to
peter out, such that 3 hit a good sweet spot.
2. Is there any theoretical value to this scheme, or anything interesting
which can be described only using it? I used it to explain a number of
small inconsistencies, but that is marginal at best.
Is there any existing mathematical precedent? I know that what j calls
arrays the literature calls tensors. So I googled for 'higher-order
tensors', but only found information on what we would call higher-_rank_
arrays, not what I distinguished here as higher-_order_ arrays. I also
searched for non-cartesian coordinate systems, but could not find anything
where the components of the coordinates were not sequential and flat.
3. Are the different orders of arrays qualitatively different? E.G. a
3rd-order array can approximate both a 1st-order array (using a scalar)
and a 2nd-order array (using a vector); but a 2nd-order array can not
approximate a 1st-order array. (This is why, to my understanding, a
scalar is an array in j, but it is not a list in k.) (On the other hand,
3rd-order arrays can not represent the unit.) I think all higher-order
arrays can approximate any 3rd-order array; but do they gain any new
powers?
4. I called arrays of order 0, 1, and 2 units, atoms, and lists,
respectively. What should arrays of order 3 be called? Perhaps 'spaces'?
Is there a sensible name for 4th- or 5th-order arrays?
Is the name 'shape' still sensible if extended to different orders?
5. How would the j primitives work if extended to work on arrays of order
other than 3? What are the rules of conformability? Can you add an atom
to a scalar? A list to a matrix? A list to a vector? When can you
catenate two 5th-order arrays? How does rank work on 4th-order arrays?
6. Is there a good intuition for higher-order arrays? I can more or less
imagine what 4th-dimensional space is like (though I can't visualize it),
but I have no idea what a 'space' of shape 2 2$y is like, even though it
has the same number of 'degrees of freedom'.
Is there a well-defined notion of distance defined in higher-order
'space'? If so, is it still scalar?
Thoughts?
-E
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm