The basic idea of a constraint solver is that you have a domain.
A constraint solver is basically a search algorithm, in essence. What you have is, you describe a problem not by describing and algorithm actually, or a recipe to solve it. But you describe the output that you want. You describe the properties of something, and you have a domain that can be infinite or finite of things or values, whatever. The algorithm finds solutions that fit your constraints. Basically, it tries to find combinations in this domain.
But solutions are, in general, not unique, right? If you have three variables, for example, and you establish a constraint relationship between them, it is not necessary that you have one possible outcome.
No, there can be any number of solutions, depends also on the type of system you have. Normally most systems are able to find all solutions. The system that I have, it's a quite simple and basic system, that is able to spit out the solution and asks for a continuation function - it's actually a bit like this wreck thing. You can call, you get the next solution. So the solutions are ordered in a certain way, it depends on the order of the domain and the way you index the domain. Basically what it does is a backtracking search. Let's say your domain is all the values from 1 to 10. And the domain is the same for all the variables. Then it assigns a value from the domain to (it instantiates) the first variable. It checks whether this works, if it works it instantiates the next one. If that doesn't work, and if it doesn't work for all the possible values of the second variable, then it would go back to the first variable and assign it the next value from its domain.