Relations or functions other than $\in$ in first order formulas in ZF According to my understanding of first order logic, a first order formula in ZF must only contain the relation symbol $\in$ and no function symbols. However in most explanations of ZF formulas involving other functions such as $\cup$ are introduced early on.
My book explains for example that $\forall a \forall b \exists c \forall v_0\ (v_0 \in c \iff (v_0 \in a \vee v_0 \in b))$ is a theorem of ZF. 
But then it goes on to treat this as a function. By my understanding
$\forall v_0(v_0 \in a \cup b \iff (v_0 \in a \vee v_0 \in b))$ is not a first order formula in the language of ZF because it contains $\cup$ which is not a symbol in the language of ZF.
Is there a formal explanation of why this formula is allowed, and how to introduce new function symbols, or is this formula actually some slightly informal logic, and we just have to believe that there is a formula using only the $\in$ symbol equivalent to that formula? 
Obviously stating any maths theorem using just $\in$ is really hard. For example how would one state $\forall x \ y \in \mathbb{N}, x + y = y + x$? Is there a formal method of doing it in a shorter way than the incredibly verbose way that would come from doing it using only $\in$?
 A: Here's the "unfolding" process in a bit more detail - there is a slight subtlety around functions vs. relations.
The relations version is easy:


*

*Suppose we have a formula $\varphi(x_1,...,x_n)$ and we've introduced a new $n$-ary relation symbol $R$ corresponding to it. Then replace every instance of "$R(t_1,...,t_n)$" for $t_1,...,t_n$ terms with "$\varphi(t_1,...,t_n)$."



Functions introduce some annoyance since they don't just affect the formulas we can build but also the terms. We need to introduce new "names" for all the terms built using $f$; we also need to do this "recursively" to handle nested instances of $f$ (like "$f(f(x))$").
The idea is to introduce via quantifiers new variables for each term involving $f$ and clauses saying that they do what they should. For example:


*

*"$f(x)\in f(y)$" becomes $$\forall u,v(\psi(x,u)\wedge\psi(y,v)\rightarrow u\in v).$$ Here $u$ is the introduced name for $f(x)$ and $v$ is the introduced name for $f(y)$; note that we could have replaced "$\forall$" with "$\exists$" in the introduction process without changing anything (since functions are single-valued).

*"$f(f(x))=x$" becomes $$\forall u,v(\psi(x,u)\wedge \psi(u,v)\rightarrow v=x).$$ Now $u$ is the introduced name for $f(x)$ and $v$ is the introduced name for $f(u)$ (which is just $f(f(x))$); note that we needed to work from the inside out.
The procedure is ultimately rather tedious to write down, but it is a good exercise.
