[proofplan]
We deduce density from the [Stone-Weierstrass theorem](/theorems/???). The strategy is to verify, on the compact Hausdorff space $K$, that $\mathcal{A}_K$ is a subalgebra of $C(K)$ that contains the constants and separates points. Each property is inherited from the corresponding property of the unrestricted class $\mathcal{A} = \{\Phi_f : f \in T((V))^*\}$ on $\mathcal{C}_p$ via the restriction map. Stone-Weierstrass then closes the argument.
[/proofplan]
[step:Verify that $K$ is a compact Hausdorff space so that Stone-Weierstrass applies]
By hypothesis $K \subset \mathcal{C}_p$ is compact. Stone-Weierstrass requires the underlying space to be compact Hausdorff. The ambient space carries the projective topology $\chi_{\mathrm{pr}}$, and by the [Hausdorff, separability, and metrisability theorem](/theorems/2504), $(\mathcal{C}_p, \chi_{\mathrm{pr}})$ is Hausdorff. Subspaces of Hausdorff spaces are Hausdorff in the subspace topology, so $K$ is Hausdorff.
[guided]
The Stone-Weierstrass theorem requires a compact Hausdorff space. Compactness of $K$ is given by hypothesis.
For the Hausdorff property, we use that the projective topology $\chi_{\mathrm{pr}}$ on $\mathcal{C}_p$ is Hausdorff. Theorem 2504 states that $(\mathcal{C}_p, \chi_{\mathrm{pr}})$ is Hausdorff: for any two distinct $x, y \in \mathcal{C}_p$, the projective topology has enough open sets to separate them. The hypothesis $\chi = \chi_{\mathrm{pr}}$ is exactly what makes this theorem applicable.
Hausdorffness passes to subspaces: if $X$ is Hausdorff and $K \subseteq X$ carries the subspace topology, then for $x, y \in K$ distinct, the disjoint open neighbourhoods $U, V \subseteq X$ from the ambient Hausdorff property restrict to disjoint relatively open neighbourhoods $U \cap K, V \cap K$ in $K$. Hence $K$ is Hausdorff.
[/guided]
[/step]
[step:Show $\mathcal{A}_K$ is a subalgebra of $C(K)$]
We verify that $\mathcal{A}_K$ is closed under pointwise addition, scalar multiplication, and pointwise multiplication, as required for a subalgebra of $C(K)$.
Take $\Phi_f|_K, \Phi_g|_K \in \mathcal{A}_K$ with $f, g \in T((V))^*$, and let $\lambda \in \mathbb{R}$.
*Closure under addition and scalar multiplication.* For every $z \in K$,
\begin{align*}
(\Phi_f|_K + \Phi_g|_K)(z) = f(S(z)) + g(S(z)) = (f + g)(S(z)) = \Phi_{f+g}(z),
\end{align*}
\begin{align*}
(\lambda \Phi_f|_K)(z) = \lambda f(S(z)) = (\lambda f)(S(z)) = \Phi_{\lambda f}(z),
\end{align*}
where $S$ is the signature map. Since $T((V))^*$ is an $\mathbb{R}$-vector space, $f + g, \lambda f \in T((V))^*$, so $\Phi_f|_K + \Phi_g|_K = \Phi_{f+g}|_K \in \mathcal{A}_K$ and $\lambda \Phi_f|_K \in \mathcal{A}_K$.
*Closure under multiplication.* By the [shuffle identity for signatures](/theorems/???), for every $f, g \in T((V))^*$ and every $z \in \mathcal{C}_p$,
\begin{align*}
\Phi_f(z) \, \Phi_g(z) = \langle f, S(z) \rangle \, \langle g, S(z) \rangle = \langle f \shuffle g, S(z) \rangle = \Phi_{f \shuffle g}(z),
\end{align*}
where $f \shuffle g \in T((V))^*$ is the shuffle product of $f$ and $g$ and $\langle \cdot, \cdot \rangle$ denotes the natural pairing of $T((V))^*$ with $T((V))$. Restricting to $K$,
\begin{align*}
(\Phi_f|_K \cdot \Phi_g|_K)(z) = \Phi_{f \shuffle g}(z) = (\Phi_{f \shuffle g}|_K)(z) \quad \text{for every } z \in K,
\end{align*}
so $\Phi_f|_K \cdot \Phi_g|_K = \Phi_{f \shuffle g}|_K \in \mathcal{A}_K$.
[guided]
A subalgebra of $C(K)$ is a subset closed under pointwise addition, scalar multiplication, and pointwise multiplication. The first two are immediate from linearity of the pairing $f \mapsto \Phi_f$, since $T((V))^*$ is itself a vector space.
The non-trivial part is closure under multiplication. Pointwise multiplication of two functions on $K$ does not obviously produce another linear functional applied to $S(z)$ — naively, the product $\Phi_f(z)\Phi_g(z) = \langle f, S(z)\rangle \langle g, S(z)\rangle$ is bilinear in $S(z)$ rather than linear, so it is not a priori of the form $\langle h, S(z)\rangle$ for any single $h \in T((V))^*$.
The remedy is the *shuffle identity* for signatures: for every $f, g \in T((V))^*$ and every $z \in \mathcal{C}_p$,
\begin{align*}
\langle f \shuffle g, S(z) \rangle = \langle f, S(z) \rangle \, \langle g, S(z) \rangle,
\end{align*}
where $f \shuffle g \in T((V))^*$ is the shuffle product of $f$ and $g$ on the dual of the tensor algebra. The proof of this identity proceeds via the iterated-integral expression for $S(z)$: the product of two iterated integrals of length $m$ and $n$ along $z$ decomposes as a sum of iterated integrals of length $m+n$ indexed by shuffle permutations of $\{1, \dots, m+n\}$, and this combinatorial decomposition is precisely the definition of $\shuffle$ on the dual side.
Equivalently, this is the algebraic content of the fact that the signature is *group-like*: the coproduct $\Delta: T((V)) \to T((V)) \widehat\otimes T((V))$ (deconcatenation) satisfies $\Delta(S(z)) = S(z) \otimes S(z)$, and the dual operation to deconcatenation is shuffle multiplication. Pairing with $f \otimes g$ on both sides yields the identity above.
Reading the identity in our setting: $\Phi_f(z)\Phi_g(z) = \Phi_{f \shuffle g}(z)$. Since $f \shuffle g \in T((V))^*$, this product is itself the value of an element of $\mathcal{A}$ at $z$. Restricting to $K$, $\Phi_f|_K \cdot \Phi_g|_K = \Phi_{f \shuffle g}|_K \in \mathcal{A}_K$. Together with linearity, $\mathcal{A}_K$ is a subalgebra of $C(K)$.
[/guided]
[/step]
[step:Show that $\mathcal{A}_K$ contains the constant functions]
Let $c \in \mathbb{R}$. Define $f_c \in T((V))^*$ to be the linear functional that picks off the degree-zero component:
\begin{align*}
f_c : T((V)) &\to \mathbb{R}, \\
a = \sum_{k \geq 0} a_k &\mapsto c \, a_0,
\end{align*}
where $a_k \in V^{\otimes k}$ is the $k$-th tensor component of $a$. (Equivalently, $f_c = c \cdot \pi_0$ where $\pi_0$ is the projection $T((V)) \to V^{\otimes 0} \cong \mathbb{R}$.)
For any $z \in \mathcal{C}_p$, the signature $S(z) \in T((V))$ has degree-zero component $S(z)_0 = \mathbf{1} \in \mathbb{R}$ by definition. Hence
\begin{align*}
\Phi_{f_c}(z) = f_c(S(z)) = c \cdot 1 = c \quad \text{for every } z \in K.
\end{align*}
So $\Phi_{f_c}|_K \equiv c$, showing the constant function $c$ lies in $\mathcal{A}_K$. As $c \in \mathbb{R}$ was arbitrary, $\mathcal{A}_K$ contains all constant functions on $K$.
[/step]
[step:Show that $\mathcal{A}_K$ separates points of $K$]
Let $x, y \in K$ with $x \neq y$. Since $K \subset \mathcal{C}_p$, both $x$ and $y$ are points of $\mathcal{C}_p$. By the point-separation property of $\mathcal{A}$ on $\mathcal{C}_p$ — which is the [point-separation theorem for signature coordinates](/theorems/???) — there exists $f \in T((V))^*$ with $\Phi_f(x) \neq \Phi_f(y)$. Restricting to $K$, $(\Phi_f|_K)(x) = \Phi_f(x) \neq \Phi_f(y) = (\Phi_f|_K)(y)$. Hence $\mathcal{A}_K$ separates points of $K$.
[guided]
Stone-Weierstrass requires the algebra to *separate points* of the underlying space: for every pair of distinct points $x, y \in K$, some element of $\mathcal{A}_K$ takes different values at $x$ and $y$. This is the only hypothesis tied to the geometric content of the signature transform — the others (subalgebra, constants) are formal.
**Reduction to the ambient space.** Take $x, y \in K$ with $x \neq y$. Since $K \subseteq \mathcal{C}_p$, both $x$ and $y$ are points of $\mathcal{C}_p$ as well, and they are distinct as points of $\mathcal{C}_p$. So the question of separating them reduces from "is there $\Phi_f|_K$ in $\mathcal{A}_K$ taking different values?" to "is there $\Phi_f$ in $\mathcal{A}$ taking different values?" — exactly because restriction commutes with evaluation: $(\Phi_f|_K)(x) = \Phi_f(x)$ for $x \in K$.
**Apply the ambient point-separation property.** The [point-separation theorem for signature coordinates](/theorems/???) on $\mathcal{C}_p$ says: for every pair of distinct path classes $x, y \in \mathcal{C}_p$ there exists $f \in T((V))^*$ with $\Phi_f(x) \neq \Phi_f(y)$. This is the substantive geometric content — it amounts to the fact that the signature map is injective on tree-reduced paths and that the dual functionals $T((V))^*$ are rich enough to read off distinct components. Applying this to our $x, y$, we obtain $f \in T((V))^*$ with
\begin{align*}
\Phi_f(x) \neq \Phi_f(y) \quad \text{in } \mathbb{R}.
\end{align*}
**Restrict to $K$.** Define $g := \Phi_f|_K \in \mathcal{A}_K$. For $x, y \in K \subseteq \mathcal{C}_p$, restriction is just evaluation:
\begin{align*}
g(x) = (\Phi_f|_K)(x) = \Phi_f(x), \qquad g(y) = (\Phi_f|_K)(y) = \Phi_f(y).
\end{align*}
Hence $g(x) = \Phi_f(x) \neq \Phi_f(y) = g(y)$, and the element $g \in \mathcal{A}_K$ separates $x$ and $y$ in $K$. Since $x, y$ were arbitrary, $\mathcal{A}_K$ separates points of $K$.
**Why this works.** Restricting an algebra to a smaller domain can only make point-separation *easier* — there are fewer pairs of points to distinguish — so any point-separating family on $\mathcal{C}_p$ remains point-separating after restriction. We never had to do new geometric work for $K$; everything is inherited.
[/guided]
[/step]
[step:Conclude density via Stone-Weierstrass]
We have established:
- $K$ is a compact Hausdorff space;
- $\mathcal{A}_K \subset C(K)$;
- $\mathcal{A}_K$ is a subalgebra of $C(K)$;
- $\mathcal{A}_K$ contains the constant functions;
- $\mathcal{A}_K$ separates points of $K$.
These are exactly the hypotheses of the [Stone-Weierstrass theorem](/theorems/???) (real version). Its conclusion is that $\mathcal{A}_K$ is dense in $C(K)$ with respect to the topology of uniform convergence. This is the claim.
[guided]
The previous four steps were the entire content of the proof. This final step is bookkeeping: we collect the verified hypotheses, apply Stone-Weierstrass, and read off the conclusion.
**The theorem we are applying.** The real form of the [Stone-Weierstrass theorem](/theorems/???):
> Let $X$ be a compact Hausdorff space, and let $\mathcal{B} \subseteq C(X; \mathbb{R})$ be a subalgebra that contains the constant functions and separates the points of $X$. Then $\mathcal{B}$ is dense in $C(X; \mathbb{R})$ with respect to the uniform norm $\|\cdot\|_\infty$.
The conclusion is *uniform density*: every continuous $\mathbb{R}$-valued function on $X$ can be approximated arbitrarily well, in the sup norm, by elements of $\mathcal{B}$.
**Verifying each hypothesis with $X = K$ and $\mathcal{B} = \mathcal{A}_K$.**
(i) *$K$ is compact*: by hypothesis of the theorem we are proving.
(ii) *$K$ is Hausdorff*: established in Step 1, using that $(\mathcal{C}_p, \chi_{\mathrm{pr}})$ is Hausdorff and that subspaces of Hausdorff spaces are Hausdorff.
(iii) *$\mathcal{A}_K \subseteq C(K)$*: each $\Phi_f \in \mathcal{A}$ is continuous on $(\mathcal{C}_p, \chi_{\mathrm{pr}})$ (this is the defining property of $\chi_{\mathrm{pr}}$, since $\chi_{\mathrm{pr}}$ is the initial topology making every $\Phi_f$ continuous). Restriction to a subspace preserves continuity, so $\Phi_f|_K \in C(K; \mathbb{R})$.
(iv) *$\mathcal{A}_K$ is a subalgebra*: established in Step 2, using linearity of $f \mapsto \Phi_f$ and the shuffle identity for the multiplication.
(v) *$\mathcal{A}_K$ contains the constants*: established in Step 3, using the projection $f_c = c \cdot \pi_0$ and the normalisation $S(z)_0 = 1$.
(vi) *$\mathcal{A}_K$ separates points of $K$*: established in Step 4, transferring point separation from $(\mathcal{C}_p, \mathcal{A})$ to $(K, \mathcal{A}_K)$ by restriction.
**Apply the theorem.** All six hypotheses are verified. Stone-Weierstrass concludes that $\mathcal{A}_K$ is dense in $C(K; \mathbb{R})$ with respect to the uniform topology: for every continuous $g : K \to \mathbb{R}$ and every $\varepsilon > 0$, there exists $f \in T((V))^*$ with
\begin{align*}
\sup_{z \in K} |g(z) - \Phi_f(z)| < \varepsilon.
\end{align*}
This is exactly the universal approximation statement claimed by the theorem: linear functionals of the signature, evaluated on a compact set $K$ of paths, are uniformly dense in continuous functions on $K$.
**Why this proof structure works.** Stone-Weierstrass converts the analytic problem of approximating arbitrary continuous functions into the algebraic problem of building a sufficiently rich function class. The hard analytic content — that the signature is fine-grained enough to distinguish paths — enters only through the point-separation step. Everything else (constants, multiplication via shuffles, linear closure) is bookkeeping about the algebraic structure of $T((V))^*$.
[/guided]
[/step]