An open set is a union of open balls

For doubt (a), you can say that the empty set is a union of open balls. Namely, the empty union, or a union of zero open balls. You could also argue, perhaps, that the open ball $B(x;0)$ is the open set, if a zero is admissible for a radius in your definitions. Either way, it is fine.


For doubt (b), I think it is appropriate to say "there exists $r(x)$" in this context. You have the existence from the open set definition, after all. You don't need to pick a particular one and mess with the axiom of choice. Thereafter it is presumed that this quantity - this quantity which you gave the name $r(x)$ - is fixed as well. So ultimately this is a nonissue.

Though pedantically/logically, I would say to write only what you say or know from the preceding steps or external definitions and to think carefully about these. You don't know if you need to choose a particular $r(x)$, nor does anything thereafter require it. You are only given existence of some $r(x)$. So it's simpler for you to simply say "there exists an $r(x)$." Perhaps there's a few crossed wires with the more colloquial meaning of choosing it that you're getting?


Regarding doubt (c): at present, you have already explicitly defined $r$ (be it $r(x),r(u)$) as much as needed. There need not be some formal calculation. I'm not sure what you could gain from something more specific.

You are correct in that there is a function $r$ handling all of this behavior of giving us the $r(x)$ for $x$ in the background. After all, this radius depends on $x$. If your open set is $U$, and you send $x \in U$ to an applicable radius $r(x)$ where $B(x;r(x)) \subseteq U$, then $r$ is a function of sorts.

However, it need not be any one particular function. Think of $\Bbb R$ or $\Bbb R^2$; clearly many radii might work for any given $x$. Hence, by picking $r : U \to \Bbb R^{>0}$, you're implicitly fixing what radii each $x \in U$ is sent to. So if you want to focus on that sort of notion, you may wish to be careful about the implications of this.

One possible work-around is allowing multi-valued or many-to-one functions, or set-valued functions. You could, for instance, define

$$ P(U,x) := \{ r \in \Bbb R^{>0} \mid B(x;r) \subseteq U \} \qquad \mathcal{P} := \{ P(U,x) \}_{x \in U}$$

and then define $r : U \to \cal P$ by $r(x) = P(U,x)$ and fix an arbitrary radius in that set for rest of the proof.

But I feel like this is ultimately all overthinking matters a bit much. You're simply taking $x$ and getting a guaranteed radius $r(x)$ - a radius which depends on the $x$ taken - so that the ball $B(x;r(x))$ centered at $x$ with this radius is contained in your open set. The formalities of what this function $r$ is or may be aren't of much concern, in my opinion.

$r_x$ is another acceptable notation, as you comment, but it is ultimately the same thing. Think of sequences: you might write their members as $a_1,a_2,\cdots$; formally, this is just a function $a : \Bbb N \to X$ for whatever space you're dealing with. We define the indexing notation $a_n$ to be $a(n)$ under more conventional notation. It's same with the $r_x$ in that respect; still a sequence (or rather a sequence-like object called a net, if you really want to dive into the details), just indexed by a different set here ($U$ in this case) which may be uncountable.

Personally I just prefer $r_x$ because it takes up less room, fewer keystrokes, and doesn't make this whole "$r$ is a function giving us a radius from a given $x$" deal as much of a focus.