Specifically, the symbol *F* in a formal language is a functional symbol if, given any symbol *X* representing an object in the language, *F*(*X*) is again a symbol representing an object in that language.
In typed logic, *F* is a functional symbol with *domain* type **T** and *codomain* type **U** if, given any symbol *X* representing an object of type **T**, *F*(*X*) is a symbol representing an object of type **U**.
One can similarly define function symbols of more than one variable, analogous to functions of more than one variable; a function symbol in zero variables is simply a constant symbol.

Now consider a model of the formal language, with the types **T** and **U** modelled by sets [**T**] and [**U**] and each symbol *X* of type **T** modelled by an element [*X*] in [**T**].
Then *F* can be modelled by the set

- [
*F*] := {([*X*],[*F*(*X*)]) : [*X*] in [**T**]},

In a treatment of predicate logic that allows one to introduce new predicate symbols, one will also want to be able to introduce new function symbols.
Introducing new function symbols from old function symbols is easy; given function symbols *F* and *G*, there is a new function symbol *F* o *G*, the *composition* of *F* and *G*, satisfying (*F* o *G*)(*X*) = *F*(*G*(*X*)), for all *X*.
Of course, the right side of this equation doesn't make sense in typed logic unless the domain type of *F* matches the codomain type of *G*, so this is required for the composition to be defined.

One also gets certain function symbols automatically.
In untyped logic, there is in *identity predicate* id that satisfies id(*X*) = *X* for all *X*.
In typed logic, given any type **T**, there is an identity predicate id_{T} with domain and codomain type **T**; it satisfies id_{T}(*X*) = *X* for all *X* of type **T**.
Similarly, if **T** is a subtype of **U**, then there is an inclusion predicate of domain type **T** and codomain type **U** that satisfies the same equation; there are additional function symbols associated with other ways of constructing new types out of old ones.

Additionally, one can define functional predicates after proving an appropriate theorem.
(If you're working in a formal system that doesn't allow you to introduce new symbols after proving theorems, then you will have to use relation symbols to get around this, as in the next section.)
Specifically, if you can prove that for every *X* (or every *X* of a certain type), there exists a unique *Y* satisfying some condition *P*, then you can introduce a function symbol *F* to indicate this.
Note that *P* will itself be a relational predicate involving both *X* and *Y*.
So if there is such a predicate *P* and a theorem:

- For all
*X*of type**T**, for some unique*Y*of type**U**,*P*(*X*,*Y*),

- For all
*X*of type**T**, for all*Y*of type**U**,*P*(*X*,*Y*) if and only if*Y*=*F*(*X*).

Many treatments of predicate logic don't allow functional predicates, only relational predicatess. This is useful, for example, in the context of proving metalogical theorems (such as Gödel's incompleteness theorems), where one doesn't want to allow the introduction of new functional symbols (nor any other new symbols, for that matter). But there is a method of replacing functional symbols with relational symbols wherever the former may occur; furthermore, this is algorithmic and thus suitable for applying most metalogical theorems to the result.

Specifically, if *F* has domain type **T** and codomain type **U**, then it can be replaced with a predicate *P* of type (**T**,**U**).
Intuitively, *P*(*X*,*Y*) means *F*(*X*) = *Y*.
Then whenever *F*(*X*) would appear in a statment, you can replace it with a new symbol *Y* of type **U** and include another statement *P*(*X*,*Y*).
To be able to make the same deductions, you need an additional proposition:

Because the elimination of functional predicates is both convenient for some purposes and possible, many treatments of formal logic do not deal explicitly with function symbols but instead use only relation symbols; another way to think of this is that a functional predicate is a *special kind of* predicate, specifically one that satisfies the proposition above.
This may seem to be a problem if you wish to specify a proposition schema that applies only to functional predicates *F*; how do you know ahead of time whether it satisfies that condition?
To get an equivalent formulation of the schema, first replace anything of the form *F*(*X*) with a new variable *Y*.
Then universally quantify over each *Y* immediately after the corresponding *X* is introduced (that is, after *X* is quantified over, or at the beginning of the statment if *X* is free), and guard the quantification with *P*(*X*,*Y*).
Finally, make the entire statment a material consequence of the uniqueness condition for a functional predicate above.

Let us take as an example the axiom schema of replacement in Zermelo-Fraenkel set theory.
(This example uses mathematical symbols.)
This schema states (in one form), for any functional predicate *F* in one variable:

- ∀
*A*, ∃*B*, ∀*C*,*C*∈*A*→*F*(*C*) ∈*B*.

- ∀
*A*, ∃*B*, ∀*C*,*C*∈*A*→*D*∈*B*.

- ∀
*A*, ∃*B*, ∀*C*, ∀*D*,*C*∈*A*→*D*∈*B*.

- ∀
*A*, ∃*B*, ∀*C*, ∀*D*,*P*(*C*,*D*) → (*C*∈*A*→*D*∈*B*).

- (∀
*X*, ∃!*Y*,*P*(*X*,*Y*)) → (∀*A*, ∃*B*, ∀*C*, ∀*D*,*P*(*C*,*D*) → (*C*∈*A*→*D*∈*B*)).