The cutoff theorem in Cutoff.lean works with finite value domains
(Fin k). But many protocols, including OneThirdRule, use unbounded
values (Nat). The concrete OneThirdRule.lean proves agreement for
Nat values directly. The OneThirdRuleCutoff.lean proves the lock
invariant on binary configurations (Fin 2 values, Config 4 n).
These are two independent proofs of the same safety property. To formally derive the concrete result FROM the cutoff result — making the cutoff the engine of the proof — we need a zero-one rule: a reduction from the unbounded-value protocol to the binary-value configuration.
To prove that the lock invariant holds for all executions of the OneThirdRule with arbitrary
Natvalues, it suffices to prove it for executions with only values 0 and 1.
The OneThirdRule is value-oblivious: the update function doesn't inspect actual values — it only counts how many copies of each value it received. If 47 processes hold value 17 and 3 hold value 42, the protocol behaves identically to 47 holding 0 and 3 holding 1.
More precisely: in any reachable state, at most one value can have a super-majority (>2n/3 holders), by pigeonhole. The protocol's behavior is determined by the partition:
- Processes holding the dominant value (if any)
- Processes holding non-dominant values
This is a binary partition. Relabeling the dominant value as 0 and all others as 1 preserves the protocol's counting behavior, threshold comparisons, and decision logic.
The zero-one rule is NOT needed if:
- You prove safety directly on the concrete protocol (as we did in
OneThirdRule.lean— the lock invariant proof works forNatvalues and general n without the cutoff).
The zero-one rule IS needed if:
- You want the cutoff to be the primary proof engine — verify at the
binary configuration level for small n, then lift to the concrete
protocol with
Natvalues at all n. - The direct proof is too complex and you rely on model checking.
Given a concrete round state with Nat values, project to a binary
configuration (Config 4 n) by:
- Identify the "dominant value" (the value with the most holders, or an arbitrary choice if no super-majority exists).
- Map each process: if it holds the dominant value, encode as
Fin 2 = 0; otherwise, encode asFin 2 = 1. - Track the decided/undecided status for the extended encoding.
def binaryProjection (s : RoundState (Fin n) LState) : Config 4 n :=
let dominant := findDominantValue s -- the value with most holders
RoundState.toConfig (fun ls =>
if ls.val = dominant then
if ls.decided.isSome then 1 -- (val=0, decided) in Fin 4
else 0 -- (val=0, undecided)
else
if ls.decided.isSome then 3 -- (val=1, decided)
else 2) s -- (val=1, undecided)The binary projection commutes with the round step: if the concrete protocol takes a step, the projected configuration takes a corresponding step (or stutters if the dominant value doesn't change).
theorem zero_one_simulation :
∀ s ho s', round_step (otr_alg n) ho s s' →
extSucc n (binaryProjection s) = binaryProjection s' ∨
binaryProjection s = binaryProjection s'The key insight: the concrete protocol's threshold check ("does value v have >2n/3 received copies?") corresponds exactly to the binary configuration's threshold check ("does Fin 2 = 0 have >2n/3 holders?") after projection, because the projection maps the dominant value to 0 and preserves counts.
Once the simulation is established, safety transfers:
theorem agreement_transfer :
(∀ n c, extLockInv n c → extLockInv n (extSucc n c)) →
pred_implies (otr_spec n).toSpec.safety [tlafml| □ ⌜agreement n⌝]This chains:
- The lock invariant holds on all binary configurations (by cutoff or
direct proof in
OneThirdRuleCutoff.lean). - The binary projection is a simulation of the concrete protocol.
- Therefore the lock invariant holds on all concrete states (via the simulation and projection).
- The lock invariant implies agreement (by pigeonhole).
The zero-one rule generalizes to other value-oblivious threshold protocols. The conditions are:
-
Value-obliviousness: the update function depends on received values only through their counts (multiset), not through arithmetic operations or comparisons on the values themselves.
-
Threshold-based decisions: decisions depend on whether counts cross a threshold, not on exact counts.
-
Binary safety property: the safety property is about at most two "groups" of processes (e.g., decided-v vs. decided-w).
Under these conditions, any execution with m distinct values can be projected to a binary execution (dominant vs. non-dominant) without affecting the safety argument. The value domain collapses from arbitrary to {0, 1}.
For protocols that ARE value-sensitive (e.g., FloodMin which takes the minimum, or protocols with value ordering), the zero-one rule does not apply directly. A different reduction or a larger finite value domain may be needed.
The zero-one rule is analogous to results in:
-
Emerson & Namjoshi (1995): symmetry reduction for model checking symmetric concurrent systems. Process symmetry allows quotienting by permutation groups.
-
German & Sistla (1992): cutoff results for cache coherence protocols, where the "data independence" property (similar to value-obliviousness) allows reducing the data domain.
-
Lazic (2000): data independence and finite-state abstractions for protocols with unbounded data. The key insight: if the protocol treats data values as "tokens" (never inspects their content beyond equality), the data domain can be collapsed.
-
Dragoi, Henzinger, Veith (2014): communication-closed layers with cutoffs for threshold-guarded protocols. Their framework is closest to ours and implicitly uses data independence.
The formal zero-one rule in Leslie would make this reduction explicit and mechanically verified, rather than relying on informal arguments about "relabeling."
- Define
findDominantValue(the value with the most holders) - Define
binaryProjection : RoundState → Config 4 n - Handle the edge case: no dominant value (all below threshold)
- Show that the concrete OTR round step on projected states matches
extSuccon the projected configuration - Handle the subtlety: the dominant value may change across rounds (but only from "none" to "some v" — once established, the dominant value is locked by the super-majority)
- Chain simulation + cutoff lock invariant → concrete agreement
- This is the payoff: the concrete safety property follows from the binary configuration verification
- Extract the zero-one rule as a reusable theorem for value-oblivious threshold protocols
- State conditions (value-obliviousness, threshold-based) formally
- Apply to other protocols (BallotLeader, etc.)
Leslie/ZeroOne.lean(future) — the formal zero-one ruleLeslie/Examples/OneThirdRuleTransfer.lean(future) — application connecting OneThirdRuleCutoff to the concrete OneThirdRuledocs/zero-one-rule.md— this document