'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 tmodule Args : Core.Applicative.Args with type a arg := a t