Cartesian product's base form takes a list of collections and produces a
collection of lists: Rene([Z,...,A]) = {[z,...,a]: a in A, ..., z in Z}.
This generalises to a relation r for which
each A in (r|) is a relation: in such a case, Rene(r) relates u to v precisely
if
r relates x to V

implies ({x}: V&on;u :) = ({x}:v:) is non-empty

.

v relates x to bimplies

b in (u:V|).

Of course, when each V is an identity (or collection), this turns the
constraint into u=v is in V

: Rene(r) is then a collection (with u as a
member). Each member of Rene(r) is, like r, a relation: in the standard case,
with r a list of collections, each members, u, of Rene(r) is a list, of the same
length as r, and, for each position, i, in these lists, Rene(r,i) a member of
r(i).

Slightly more generally, with r a mapping whose outputs are all collections,
each member of Rene(r) is a mapping, with the same inputs as r and each of its
outputs is a member of the corresponding output of r. This becomes u in
Rene(r)

means u = ((|r): x-> u(x) :r(x))

, which is what I know I need if
I'm to use Rene in the context of smooth manifolds and their tensor
bundles.

When r is a mapping and each r(x) is also a mapping, Rene(r) maps u to v precisely if: u, v are mappings and accept the same inputs as r; and, for each input, i, r(i) maps u(i) to v(i). Formulaicly, r(i,u(i)) = v(i), so r(i)&on;u maps i to v(i). Thus, when a tensor bundle is Rene(T) for T = (Manifold| p-> {tangents at p} :), the linear structure on each T(p) induces linear structure on Rene(T). Likewise G = (Manifold| p-> {gradients at p} :) gives the gradient bundle as Rene(G): similarly for each rank of the tensor bundle. A mapping (Manifold| p-> u(p) :{linear (T(p)| :G(p))}) yields Rene(u) as a linear map (Rene(T)| :Rene(G)), and likewise with T, G replaced by any ranks of the tensor bundle.

Written by Eddy.