# Cartesian Products

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.

This definitely tells us that (|u) = (|r) = (|v). It also tells us that v relates x to b implies 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.