
AC-3 maintains a queue of arcs. When REMOVE-INCONSISTENT-VALUES prunes DOMAIN[Xᵢ], every arc (Xₖ, Xᵢ) pointing at Xᵢ gets re-enqueued — at the back. A natural objection: the arcs we just invalidated are the freshest leads. Shouldn't they jump the queue and get processed immediately, instead of waiting behind everything already in line?
The answer splits cleanly into two layers:
Collect all domain vectors into one space:
$L = \mathcal{P}(D_1) \times \cdots \times \mathcal{P}(D_n)$
ordered componentwise by inclusion ⊑. Since every Dᵢ is finite, L is a finite complete lattice. Each arc (i, j) defines a revise operator Rᵢⱼ : L → L that touches only component i:
$R_{ij}(D)_i = \{\, x \in D_i : \exists\, y \in D_j,\ (x,y) \text{ satisfies the constraint} \,\}$
Three properties do all the work:
| Property | Statement | Why it holds |
|---|---|---|
| Reductive | Rᵢⱼ(D) ⊑ D | Revise only deletes values, never adds |
| Monotone | D ⊑ D′ ⟹ Rᵢⱼ(D) ⊑ Rᵢⱼ(D′) | If x finds a support y in the smaller Dⱼ′, it certainly finds one in the larger Dⱼ. Smaller domains ⟹ fewer survivors. This is the load-bearing property. |
| Finite descent | No infinite strictly decreasing chain in L | L is finite; every strict step deletes ≥ 1 value |
Theorem (Cousot & Cousot, chaotic iteration). Apply the operators {Rᵢⱼ} in any fair order — fair meaning every arc invalidated by a domain change is eventually re-examined, which is exactly what AC-3's queue mechanism enforces. Then the iteration terminates in finitely many steps, and every fair schedule stops at the same point: the greatest fixpoint gfp = the largest arc-consistent sub-domain contained in the initial domains.
Proof sketch (a lattice squeeze argument):