Soon an even more radical step was taken when it was recognised that
unification could be replaced by any constraint system and solver,
provided certain conditions were satisfied.
There was no need for a unification algorithm (which reduces an
equation between expressions to an equivalent set of variable assignments).
Indeed the constraints need not be equations
at all.

The resulting scheme

(Jaffar and Lassez, 1987)
called the Constraint
Logic Programming Scheme,
and written CLP(X),
was illustrated by choosing mathematical equations and inequations as
the constraint system, and the Simplex algorithm as the solver.
This instance of CLP(X) is called CLP( ), and is described in
a later section.

It has inspired a whole research area, exploring the
interface between logic and mathematical programming.
One resulting constraint programming language is 2LP (Linear
Programming and Logic Programming) which embeds mixed integer
programming in a constraint programming system.
Another is Newton, which uses interval constraints to do solve
hard mathematical problems involving polynomials.

The next step beyond the standard constraint logic programming scheme
was to include more than one constraint system and solver in a single
system.
Even CLP( ) was, in fact, such a combination including
syntactic unification, Gaussian elimination and the Simplex.
CLP systems nowadays include a variety of solvers which exchange
information through shared variables.
For numeric variables, in addition to the above solvers, there may
also be a Groebner base rewriting system for handling polynomial
equations, a very powerful CAD solver and a weaker but very useful
constraint handler for reasoning on numeric intervals.
The latter three system are typically useful for non-linear
constraints, containing expressions in which variables are multiplied
together.