After establishing the fundamental results, we address further **properties of**
derived propagators such as idempotence, subsumption, and events. Finally, we clarify the connection between derived propagators and path consistency when regarding views as binary constraints.

We introduce techniques for deriving propagators that use views for specialization and generalization of propagators, channeling between variable domains, and general domain-specific transformations. We show how to apply these techniques for different variable domains using various views. We provide a breakdown of how successful the use of derived propagators has been **for Gecode.**
Overview. **The next section introduces the basic notions we will use. Sect. 3**
presents views and derived propagators and proves fundamental properties like correctness and completeness. The following three sections develop techniques for deriving propagators: transformation, generalization, specialization, and channeling. Sect. 7 presents extensions of the model, and Sect. 8 discusses its limitations. Sect. 9 provides empirical evidence that views are useful in practice.

## 2 Preliminaries

This section sets the stage for the paper with definitions of the basic concepts.

Variables and constraints. We assume a finite set of variables Var =
{x1, . . . , xn} and a finite set of values Val**. Constraints are characterized by**
assignments a ∈ Asn that map variables to values: Asn = Var → Val. A constraint c ∈ Con **is a relation over the variables, represented as the set of**
all assignments that satisfy the constraint, Con = 2Asn**. We base constraints**
on full assignments, defined for all variables in Var . However, for typical constraints, only a subset vars(c) of the variables is significant**; the constraint**
is the full relation for all x /∈ vars(c**). We write a constraint in extension** (c = {(x 7→ 0, y 7→ 1),(x 7→ 1, y 7→ 2)}) or intensionally (c ≡ **x < y**).

Domains. **Constraints are implemented by propagators over domains, which**
are constructed as follows. A domain d ∈ Dom **maps each variable to a finite set** of possible values, the variable domain d(x) ⊆ Val.

A domain d **can be identified with a set of assignments** d ∈ 2 Asn**. We can**
therefore treat domains as constraints. In particular, for any assignment a, {a}
is a domain as well as a constraint. We simply write domain **for domains and**
variable domains when there is no risk of confusion.

A domain d1 is stronger than a domain d2 (written d1 ⊆ d2**), iff for all**
variables x, d1(x) ⊆ d2(x). By dom(c**) we refer to the strongest domain including**
all valid assignments of a constraint, defined as min{d ∈ Dom | c ⊆ d} =
{a | ∀x ∃b ∈ c. a(x) = b(x)}**. The minimum exists as domains are closed under** intersection, and the definition is non-trivial because not every constraint can be captured by a domain. Now, for a constraint c and a domain d**, dom(**c ∩ d)
refers to removing all values from d **not supported by the constraint** c.