]>
The Cartesian product, named after René Descartes, is orthodoxly a
way of taking a list of sets and generating a set of lists; if we have a list
({collections}:F|n) with n natural, the cartesian product C of F is that
collection for which: list (:c|n) is in C
iff i in n implies c(i) in
F(i)
. Thus [a,b] is a member of A×B
(as orthdoxy writes it),
the cartesian product of [A,B], iff a is in A and b is in B. I depart from
orthodoxy in not using × to denote this (it's too heavily over-loaded
already); it will be Rene([A,B]) or {[a, b]: a in A, b in B}.
At the same time, the theory of smooth manifolds obliges one to deal
extensively with functions of form (:F|M), with M the smooth manifold, for which
F(m) is a linear space, for each m; F is then a tensor rank
on M and
a section of
F is a mapping (:f|M) for which f(m) is a member of F(m) for
each m in M (subject to some continuity conditions not relevant here). This
clearly has the same form, with m and M replacing i and n in the above. The
situation is then further complicated by the fact that each F(m) is formally
constructed from a pair of equivalence relations at m (and possibly some tensor
algebra), so that I'd ideally like to allow that F's outputs need not be
collections – e.g. they may be equivalences. Expanding the uses
of in
above, we get C relates c to d
iff i in n implies F(i)
relates c(i) to d(i)
, which perfectly safely allows us arbitrary relations
as the outputs of F; and allows n to be any collection (or, indeed, general
relation; but only its collection of fixed points will matter).
It would be feasible to be more general yet and say: C relates c to d
iff i in n implies F relates, to i, some r which relates c(i) to d(i)
,
but replacing F with (: unite(|F:{i}) ←i :(:F|)) would reduce this to the
above form; so there is no benefit in allowing F to be a more general relation
– a mapping is as general as we have any use for. In specifying Rene, it
is necessary to constrain C's left and right values to have the same right
values as F (i.e. F's inputs) but we need not constrain c and d to be mappings,
so long as each of them does have every input, i, to F as a right value and F(i)
does relate each value that c relates to i to each value that d relates to i
– which is the appropriate reading of F(i) relates c(i) to d(i)
in
this case, with c(i)
and d(i)
being ambiguous expressions that
denote each of the values they may
all at the same time.
I therefore address the theoretical construct of the cartesian product by defining the mapping
i in nimplies
F(i) relates c(i) to d(i):{mappings}) ← ({relations}:F|n) :{mappings})
which mediates the above. If (:{mappings}|F) then F(i) relates c(i) to d(i)
translates
to c(i) = F(i,d(i))
so Rene(F) can be written (: (: F(i,d(i)) ←i :)
← (:d|(:F|)) :). When, furthermore, (:{collections}|F), Rene(F) becomes
{d: i in (:F|) implies d(i) in F(i)}, which is its orthodox cartesian product,
at least when F is a list (i.e. (:F|) is natural).
At the same time, if F is a rank
of some smooth manifold's tensor
bundle, Rene(F) is the collection of sections – a.k.a. tensor fields (on
the whole manifold) – of that rank. If (:F|M) is a section of the rank
which describes linear maps from one rank, A, to another, W – a.k.a. a
tensor field whose value at each point, m, is a linear map (W(m): F(m) |A(m))
– then Rene(F) = (Rene(W): (: F(m,a(m)) ←m |M) ←(:a|M) :Rene(A))
is a pointwise linear
map from sections of A to sections of W. Indeed,
the case where F was a rank is just a special case of this: a rank is the
identity on itself, and trivially linear, so Rene maps it to the identity
(pointwise linear) map on sections of that rank, i.e. the collection of such
sections.
[Complication: for equivalences … G(m) and T(m) are equivalences on {({scalars}:h:M): h smooth on some neighbourhood of m} and {(M:f:{scalars})←t: f(t) = m, f smooth in some neighbourhood of t}, respectively … really want mappings from any rank to G or T to be nice about these equivalences … but that can always be implemented by suitable composition with G or T.]
Now, if we have (:F|M) and (:H|M) as sections of two ranks describing linear maps, with H's output rank being F's input rank, we can construct (: F(m)&on;H(m) ←m |M) which is then a section on a third rank describing linear maps, from H's input rank, (: (:H(m)|) ←m |M), to F's output rank, (: (|F(m):) ←m |M). Applying Rene to the composite, we get
so that the pointwise composite
of F and H can be written as
reverse(Rene, Rene(F)&on;Rene(H)). [The structure of this
echoes that of star(a*b) = star(a)&on;star(b) for
a binary operator, *, and its associated mapping, star = (: (: u*v ← v :)
←u :).]
Now, in the case where one F(i) is empty, Rene(F) is empty. However, when discussing functions from within (:F|), with each F(i) a collection, it is still useful to have the same constraint, f(i) in F(i) for each i, albeit limited to all i in (:f|), which might not be all of (:F|). As ever, I duly generalise this from collections to relations and thus define:
F(i) relates c(i) to d(i):{mappings}) ← ({relations}:F|n) :{mappings})
When one F(i) is empty, the cartesian product of F is also empty; whereas the mappings partialRene(F) relates to one another are merely constrained to not have this i as a right value.
When F is some tensor rank of a smooth manifold, partialRene(F) contains the sections of that tensor rank on open neighbourhoods of the manifold; we can add these (pointwise, as ever), although smooth sections from distinct open neighbourhoods will have non-smooth sum unless each goes smoothly to zero at as much of its open neighbourhood's boundary as lies within the other's open neighbourhood.