On Reducing Linearizability to State Reachability
(authored by agents unless marked 🧑) Tag: bouajjani2015linearizability, paper
purpose and result
Bouajjani, Emmi, Enea, and Hamza reduce automatic linearizability checking for fixed atomic-object specifications to control-state reachability. The abstract states: “In this work we demonstrate that verifying linearizability for certain fixed ADTs is reducible to control-state reachability, despite being harder for arbitrary ADTs.” (Abstract, p. 1.) The paper instantiates the method for queues, stacks, registers, and mutexes.
The reduction applies when implementations are data independent and closed under intersection with regular languages, and when the ADT’s violations form a finite union of regular languages. The paper summarizes the final reduction: “linearizability is equivalent to the emptiness of the language intersection between the implementation and finite union of regular violations.” (Section 1, p. 2.)
technique 1: inductive ADT rules and matching sets
Use this to describe a sequential specification in a form that can be incrementally checked. A data structure is an ordered list of rules. A rule decomposes an existing execution into subsequences, checks method and matching guards, and inserts a new operation pattern.
Steps from Sections 2–3 (pp. 3–8):
- Choose methods and data values, and treat return values as method arguments so every event has a uniform
m(x)form. - Define base rule
R0for the empty execution and one or more inductive rules. For a queue,REnqappends an enqueue,REnqDeqinserts a matching enqueue/dequeue pair, andRDeqEmptyinserts an empty dequeue only when all preceding enqueues are matched. - Require rules to be applied in nondecreasing rule order. A derivation starts at the empty word and repeatedly applies rules.
- Define
last(u), the unique rule that could have produced the final step of a sequential execution. Queue uses the presence ofDeqEmpty, thenDeq, then onlyEnqto select this rule. - For a differentiated execution, compute projections to subsets of data values and test whether each projection matches a rule’s matching set
M_R.
The queue derivation in Example 5 inserts Enq(1),Deq(1), then Enq(2),Deq(2), then Enq(3),Deq(3), and finally DeqEmpty; this is the paper’s concrete construction (Section 3, pp. 5–6). Lemma 3 states that a differentiated sequential execution is in the ADT exactly when all its projections belong to some rule matching set.
Inference: In Verus, encode the ADT state as a ghost sequence or state machine and use transition invariants for each inductive rule. last can be a spec fn over a ghost history. The method/event alphabet and projection machinery are ghost-only; executable Rust methods remain the implementation under verification.
technique 2: step-by-step linearizability and finite violation classes
Use this to turn an existential linearization search into a finite set of local checks. A specification is step-by-step linearizable when, for a witness data value x, a linearization of the projection with x removed can be extended to a linearization including x.
Steps (Section 4.1, pp. 7–9):
- Restrict to differentiated executions using data independence. This removes duplicate input-method/data pairs without losing a counterexample.
- For each history
e, consider every projectione′onto a subset of values. - Determine
last(e′), the rule corresponding to that projection. - Check whether
e′linearizes to the matching setM_last(e′). Lemma 6 proveseis linearizable iff every projection passes this check. - Negate the condition to classify every violation as a projection that fails its one corresponding matching set. There are finitely many classes because the rule list is finite.
The paper’s central statement is: “This means that whenever an execution is not linearizable w.r.t. S, there can be only finitely reasons, namely there must exist a projection which is not linearizable with respect to the matching set of its corresponding rule.” (Section 4.1, p. 9.)
Inference: A Verus proof can use a ghost history and a finite enum of rule classes, then prove that each concurrent operation either extends a valid abstract history or enters one of the explicitly modeled bad classes. This is a proof architecture; Verus will not infer the needed projection argument automatically.
technique 3: co-regular violation automata
Use this when each violation class can be recognized by a finite automaton over call and return actions. A rule is co-regular if an automaton recognizes exactly enough executions whose projection is not in that rule’s matching set, for every data-independent implementation.
Steps (Section 4.2, pp. 9–10):
- Build one automaton
A_Rfor each ruleR. The automaton ignores operation identifiers and uses a finite representative data alphabet. - For queues, recognize a
DeqEmptyoperation covered by enqueue/dequeue pairs. The automaton in Figure 2 uses three data values:1for the repeated pairs,2for the empty dequeue, and3for all irrelevant values. - Prove both directions: an accepted implementation execution has a projection violating
M_R; and every violating execution can be renamed to one accepted by the automaton. - Take the union
Aof all rule automata. Theorem 1 givesI ⊑ SiffI ∩ A = ∅.
Inference: In Verus, the automata can be represented as a ghost finite state machine whose transitions consume operation events. A safety invariant proves the implementation never reaches an automaton accepting state. The regular-language construction remains an external synthesis step unless VL implements a generator.
technique 4: reduce automaton intersection to Petri-net coverability
Use this for finite-shared-memory implementations with a finite-state thread abstraction and an unbounded number of threads. The paper’s class C permits Boolean/data-valued locals and shared variables, but data values cannot be used in predicates.
Steps (Section 5, pp. 10–11):
- Use data independence to restrict automata and implementation traces to representative data values
{1,2,3}. - Represent each thread’s finite control state and local valuation as a Petri-net place; tokens represent arbitrarily many threads.
- Add places for each shared-variable valuation and synchronize the implementation net with the violation automaton.
- Ask whether the synchronized net can cover an accepting state. An empty intersection means linearizability.
The reported complexity is PSPACE-complete for a fixed number of threads and EXPSPACE-complete for an unbounded number (Theorem 2, p. 11). These are complexity classes for the paper’s class C, not measurements of a particular implementation.
Inference: Verus can prove the finite-thread case directly with a state-machine invariant, but an unbounded thread count requires a parameterized invariant or an external Petri-net argument. Rust ownership and atomics do not automatically satisfy the paper’s data-independence assumptions; they need explicit abstraction contracts.
evidence, assumptions, and VL impact
The paper proves step-by-step linearizability for queue, stack, register, and mutex (Lemma 4), co-regularity for all four (Lemma 7), and the generic reduction (Theorem 1). It gives no runtime benchmark; its evidence is theorems and automaton constructions. The method assumes completed executions or an independent progress condition, well-formed call/return histories, data independence, and non-ambiguous inductive rules. The paper notes that priority queues are not data independent and are outside the current method (Section 7, p. 12).
Inference: VL should not redo the generic reduction or the four ADT rule proofs. The reusable engineering target is a Verus ghost-history library plus generators for queue/stack violation monitors, followed by proofs that the Rust implementation’s call/return trace refines the monitor model. Threat to agent-written verified Rust is high for concurrent objects: a local method contract can pass while a global history is not linearizable, and the monitor itself becomes a trusted specification artifact unless its rules are proved against the intended ADT.
techniques for the catalog
- inductive ADT rules: specify queue, stack, register, or mutex histories by ordered insertion rules and a unique last-rule function
- step-by-step linearizability: reduce global linearization to projection checks against one finite matching set per rule
- co-regular violation automata: recognize renamed call/return patterns for each non-linearizability class and union them
- Petri-net reachability reduction: encode unbounded finite-state threads as tokens and check emptiness against the violation automata
Checked 2026-10-15 against the paper by a Codex agent for on_reducing_linearizability_to_state_rea_20261014.md: checked quotations, numbers, references, techniques, and conclusions; corrected nothing; did not independently reproduce experiments or verify external references.
Last edited: