'a t
can be applied to a state and a variable assignment to return
'a
or fail. The reason we wrap this up in an opaque type is that our solver
keeps track of the variables used in each expression.
See documentation of the predicate
function below for an example of use.
val variable : 'a Variable.t ‑> 'a t
module Args : Core.Applicative.Args with type a arg := a t