Configuration problems often involve large product catalogs, and the
given user requests can be met by many different kinds of parts from
this catalog. Hence, configuration problems are often weakly
constrained and have many solutions. However, many of those solutions
may be discarded by the user as long as more interesting solutions are
possible. The user often prefers certain choices to others (e.g., a red
color for a car to a blue color) or prefers solutions that minimize or
maximize certain criteria such as price and quality. In order to
provide satisfactory solutions, a configurator needs to address user
preferences and user wishes. Another important problem is to provide
high-level features to control different reasoning tasks such as
solution search, explanation, consistency checking, and
reconfiguration. We address those problems by introducing a preference
programming system that provides a new paradigm for expressing user
preferences and user wishes and provides search strategies in a
declarative and unified way, such that they can be embedded in a
constraint and rule language. The preference programming approach is
completely open and dynamic. In fact, preferences can be assembled from
different sources such as business rules, databases, annotations of the
object model, or user input. An advanced topic is to elicit preferences
from user interactions, especially from explanations of why a user
rejects proposed choices. Our preference programming system has
successfully been used in different configuration domains such as loan
configuration, service configuration, and other problems.