Function and Constant Symbols
Function symbols and constants expand what predicate logic can express. Constants let you name specific, fixed objects in your domain, while function symbols represent operations that take inputs and produce outputs. Together with variables, they form terms, which are the building blocks you plug into predicates to make formulas.
Defining Function and Constant Symbols
Constant symbols refer to specific, fixed elements in the domain of discourse. They never take arguments and always pick out the same object. For example, if your domain is the natural numbers, you might use a constant to denote the number zero.
Function symbols represent operations that take one or more arguments and return a single value from the domain. Think of them as mappings: you feed in objects, and the function gives back an object.
- The arity of a function symbol is the number of arguments it takes.
- A unary function (arity 1) takes one argument, like a "successor" function .
- A binary function (arity 2) takes two arguments, like an addition function .
A useful way to think about it: constants are actually just function symbols with arity 0. They take no inputs and simply return a fixed element.
Syntax and Notation
- Function symbols are typically written as lowercase letters: , ,
- Constant symbols are also lowercase letters: , ,
- The arity of a function shows up in how many argument places follow the symbol:
- has arity 2
- has arity 1
- Functions and constants can be combined into more complex expressions. For instance, applies the function to two arguments: the constant and the result of applying to .

Terms
Defining Terms
A term is any well-formed expression that refers to an object in the domain of discourse. Terms are what you slot into the argument places of predicates to build atomic formulas.
Terms come in two varieties:
- Simple terms: a single variable (, ) or a single constant (, ).
- Complex terms: formed by applying a function symbol to other terms, like or .
More precisely, the set of terms is defined recursively:
- Every variable is a term.
- Every constant symbol is a term.
- If is a function symbol of arity , and are terms, then is a term.
- Nothing else is a term.

Constructing Complex Terms
Complex terms are built by applying function symbols to simpler terms, and there's no limit to how deeply you can nest them.
For example, is constructed in layers:
- Start with the constants , , and (simple terms).
- Apply the unary function to , producing the complex term .
- Apply the binary function to and , producing .
- Apply the binary function to the results from steps 2 and 3, producing .
At each step, the arity of the function must match the number of arguments you provide. Writing when is a binary function symbol would be a syntax error.
Semantics
Interpreting Function Symbols
On their own, symbols like and are just letters. An interpretation (also called a structure) gives them concrete meaning by specifying:
- A domain of discourse (the set of objects you're reasoning about).
- A mapping from each constant symbol to a specific element in the domain.
- A mapping from each function symbol to an actual function on the domain, respecting arity. A binary function symbol must map to a function that takes exactly two inputs.
The same symbol can mean different things under different interpretations. Under one interpretation, might represent addition on the integers; under another, it might represent multiplication.
Evaluating Terms
Once you have an interpretation (and an assignment of domain elements to any variables), you can compute the value of any term by working from the inside out:
- Constants: Look up the element assigned by the interpretation.
- Variables: Look up the element assigned by the variable assignment.
- Complex terms: Evaluate all the subterms first, then apply the concrete function that the interpretation assigns to the function symbol.
For example, suppose your domain is the integers, is interpreted as 3, as 5, as the successor function (adds 1), and as addition. To evaluate :
- evaluates to 3.
- evaluates to .
- evaluates to 5.
- evaluates to .
This recursive evaluation process is what lets predicate logic assign precise, determinate meanings to even deeply nested terms.