Quorum lemmas
Three structural facts about \frac{2}{3}-quorums
(quorum_2): up-closure under superset, nonemptiness under
positive thresholds, and the derived QuorumContext
construction.
Up-closure
quorum_2_upclosed says that if q is a
\frac{2}{3}-quorum and q \subseteq q' \subseteq V(b), then
q' is also a \frac{2}{3}-quorum. The weight condition is
inherited from q via wt_inc_leq (monotonicity of weight).
This is the mechanism by which supermajority_weaken and
supermajority_link_of_quorum_votes promote a known quorum
to a larger supporter set.
Nonemptiness
quorum_2_nonempty_of_threshold_pos derives
q.\mathrm{Nonempty} from 0 < f_{2/3}(\operatorname{wt}(V(b))):
a positive threshold forces the quorum to contain at least one
element (the empty set has weight 0).
quorum_context_of_threshold_pos wraps this into a
QuorumContext value.
Downstream use
quorum_2_upclosed is consumed in
Lemmas/Justification.lean (supermajority_weaken) and
Lemmas/PlausibleLiveness.lean
(supermajority_link_of_quorum_votes).
quorum_context_of_threshold_pos provides a concrete
QuorumContext whenever the threshold is known to be positive.
variable {Validator : Type u}variable {Hash : Type v}variable [DecidableEq Validator]Enlarging a quorum preserves the quorum property
Up-closure of \frac{2}{3}-quorum status: enlarging a quorum
q to a superset q' that still lies within V(b) preserves
the quorum property.
q \subseteq q' \;\wedge\; q' \subseteq V(b) \;\wedge\; \operatorname{quorum\_2}(q, b) \;\implies\; \operatorname{quorum\_2}(q', b)
Proof idea
The two conjuncts of quorum_2 for q' are discharged
separately:
-
Subset:
q' \subseteq V(b)is the explicit hypothesishsub_vset. -
Weight: the chain
f_{2/3}(\operatorname{wt}(V(b))) \le \operatorname{wt}(q) \le \operatorname{wt}(q')uses the quorum weight bound fromq(the second conjunct ofquorum_2forq) and monotonicity of weight (wt_inc_leq) applied toq \subseteq q'.
Assumptions
-
q \subseteq q'— the enlargementhsub; -
q' \subseteq V(b)— the new set still consists of validators eligible atbhsub_vset(this keepsq'a legitimate quorum and is not automatic fromq \subseteq q'); -
\operatorname{quorum\_2}(q, b)—qis already a quorumhq.
[\mathsf{DecidableEq}\ \mathsf{Validator}] is in scope as a
section variable.
Non-assumptions
-
the threshold
f_{2/3}need not be positive — up-closure holds even at a degenerate zero threshold; -
nonemptiness of
qis not assumed (it follows separately, under a positive threshold, inquorum_2_nonempty_of_threshold_pos).
Role in the development
The mechanism by which supermajority_weaken and
supermajority_link_of_quorum_votes promote a known quorum
to a larger supporter set in an extended state — the monotonicity
that lets a quorum's witnesses survive when more votes are added.
theorem quorum_2_upclosed
(τ : Threshold)
(stake : Validator → Nat)
(vset : Hash → Finset Validator)
{b : Hash}
{q q' : Finset Validator}
(hsub : q ⊆ q')
(hsub_vset : q' ⊆ vset b)
(hq : quorum_2 τ stake vset q b) :
quorum_2 τ stake vset q' b :=
match hq with
| ⟨_, hq_wt⟩ => ⟨hsub_vset, le_trans hq_wt (wt_inc_leq stake hsub)⟩A positive threshold forces quorums to be nonempty
Nonemptiness from a positive threshold: if the two-thirds
threshold f_{2/3}(\operatorname{wt}(V(b))) is strictly positive,
then any \frac{2}{3}-quorum q at b is nonempty.
0 < f_{2/3}(\operatorname{wt}(V(b))) \;\wedge\; \operatorname{quorum\_2}(q, b) \;\implies\; q.\mathrm{Nonempty}
Proof idea
The quorum weight bound gives
0 < f_{2/3}(\operatorname{wt}(V(b))) \le \operatorname{wt}(q),
so \operatorname{wt}(q) > 0. The proof then proceeds by
Finset.induction_on on q with the motive
0 < \operatorname{wt}(s) \implies s.\mathrm{Nonempty}:
-
Empty case:
\operatorname{wt}(\emptyset) = 0, so0 < 0is absurd (Nat.not_lt_of_ge+Nat.zero_le). -
Insert case: the inserted element
awitnesses nonemptiness of\{a\} \cup s'.
Role in the development
This is the nonemptiness witness that
QuorumContext carries. It is consumed everywhere a
validator must be extracted from a quorum — most critically in
good_votes_mean_source_justified and
maximal_link_exists.
theorem quorum_2_nonempty_of_threshold_pos
(τ : Threshold)
(stake : Validator → Nat)
(vset : Hash → Finset Validator)
{b : Hash}
{q : Finset Validator}
(hpos : 0 < τ.two_third (wt stake (vset b)))
(hq : quorum_2 τ stake vset q b) :
q.Nonempty :=
match hq with
| ⟨_, hq_weight⟩ =>
Finset.induction_on q
(motive := fun s => 0 < wt stake s → s.Nonempty)
(fun h0 => False.elim ((Nat.not_lt_of_ge (Nat.zero_le _)) h0))
(fun a _ _ _ _ => ⟨a, Finset.mem_insert_self a _⟩)
(Nat.lt_of_lt_of_le hpos hq_weight)
Constructing a QuorumContext from universally positive thresholds
Concrete QuorumContext: if
f_{2/3}(\operatorname{wt}(V(b))) > 0 for every block b, then
the quorum_2_nonempty_property holds and can be bundled into
a QuorumContext:
\bigl(\forall b,\; 0 < f_{2/3}(\operatorname{wt}(V(b)))\bigr) \;\implies\; \operatorname{QuorumContext}(\tau, \mathsf{stake}, \mathsf{vset})
Proof idea
The single field quorum_2_nonempty of QuorumContext
is discharged by applying
quorum_2_nonempty_of_threshold_pos at each block b,
using the universally quantified positivity hypothesis to supply
the 0 < f_{2/3}(\operatorname{wt}(V(b))) premise.
Role in the development
This provides the concrete QuorumContext that
Theories/PlausibleLiveness.lean and
Theories/AccountableSafety.lean thread as a standing
parameter. The alternative is to assume a QuorumContext
directly — this theorem shows that positive thresholds suffice.
theorem quorum_context_of_threshold_pos
(τ : Threshold)
(stake : Validator → Nat)
(vset : Hash → Finset Validator)
(hpos : ∀ b : Hash, 0 < τ.two_third (wt stake (vset b))) :
QuorumContext (Hash := Hash) τ stake vset :=
⟨fun b _ hq => quorum_2_nonempty_of_threshold_pos τ stake vset (hpos b) hq⟩