A logical variable is a term introduced by a universal or existential quantifier.
Logical variables in Ivy are always written as lexical variables, that is as tokens beginning with a capital letter (eg. X, Foo, P123).
A free logical variable (occurring outside of any quantifier) is implicitly universally quantified. Some forms of declarations and statements make use of this as an abbreviation.
A logical variable should not be confused with a state variable:
- State variables are ground terms themselves, that represent the possible targets of assignment statements, as actions execute.
- Logical variables are placeholders for ground terms in a first-order logic formula.
Example:
Suppose we have the formulas
type t
type u
var s:t
function f(X:t): u
The type t is a ground term, as is the type u.
The declared variable s is a state variable and is also a ground term of type t.
The function f is an uninterpreted function without a definition, so is also a state variable. The function symbol f on its own is a ground term, but a quantified formula like forall X. f(X) is not a ground term because it contains a logical variable X.
An application of f to a ground term, like f(s), is a ground term of type u.
In a formula with an explicit logical variable such as:
forall V:t. V = s
We have a new logical variable V which may range over ground terms of type t, such as s or f(s). That is, the formula may be instantiated as s = s or f(s) = s, each of which is a ground term of type bool.