Constraint processing is complementary to logic programming: logic programming is concerned with proving theorems from a set $\Gamma$ of sentences which are assumed to have a model; constraint processing is concerned with finding a model for $\Gamma$. This view of constraint processing has been realized in the language Galileo which we introduce in this paper. In Galileo, any sentence (atomic, compound or quantified) from full first-order classical logic is a well-formed constraint. In fact, classical logic sentences are only a subset of the well-formed constraints in Galileo; any sentence in first-order Free Logic, which subsumes classical logic, is a well-formed constraint in Galileo. This expressive power comes at the price of involving the user in the constraint satisfaction process. The user of a Galileo program and the Galileo interpreter form a composite constraint satisfaction system in which the run-time system performs what we call constraint {\it monitoring}. We have successfully used Galileo to implement several CAD applications, fragments from one of which we present in the paper, in order to illustrate the usage of Free Logic.(274kb PDF)