Theory Heard_Of.Majorities
theory Majorities
imports Main
begin
section ‹Utility Lemmas About Majorities›
text ‹
  Consensus algorithms usually ensure that a majority of processes
  proposes the same value before taking a decision,
  and we provide a few utility lemmas for reasoning about majorities.
›
text ‹
  Any two subsets ‹S› and ‹T› of a finite  set ‹E› such that
  the sum of their cardinalities is larger than the size of ‹E› have a
  non-empty intersection.
›
lemma abs_majorities_intersect:
    assumes crd: "card E < card S + card T"
        and s: "S ⊆ E" and t: "T ⊆ E" and e: "finite E"
    shows "S ∩ T ≠ {}"
proof (clarify)
  assume contra: "S ∩ T = {}"
  from s t e have "finite S" and "finite T" by (auto simp: finite_subset)
  with crd contra have "card E < card (S ∪ T)" by (auto simp add: card_Un_Int)
  moreover
  from s t e have "card (S ∪ T) ≤ card E" by (simp add: card_mono)
  ultimately
  show "False" by simp
qed
lemma abs_majoritiesE:
  assumes crd: "card E < card S + card T"
      and s: "S ⊆ E" and t: "T ⊆ E" and e: "finite E"
  obtains p where "p ∈ S" and "p ∈ T"
proof -
  from assms have "S ∩ T ≠ {}" by (rule abs_majorities_intersect)
  then obtain p where "p ∈ S ∩ T" by blast
  with that show ?thesis by auto
qed
text ‹Special case: both sets ‹S› and ‹T› are majorities.›
lemma abs_majoritiesE':
  assumes Smaj: "card S > (card E) div 2" and Tmaj: "card T > (card E) div 2"
      and s: "S ⊆ E" and t: "T ⊆ E" and e: "finite E"
  obtains p where "p ∈ S" and "p ∈ T"
proof (rule abs_majoritiesE[OF _ s t e])
  from Smaj Tmaj show "card E < card S + card T" by auto
qed
text ‹
  We restate the above theorems for the case where the base type
  is finite (taking ‹E› as the universal set).
›
lemma majorities_intersect:
  assumes crd: "card (UNIV::('a::finite) set) < card (S::'a set) + card T"
  shows "S ∩ T ≠ {}"
  by (rule abs_majorities_intersect[OF crd]) auto
lemma majoritiesE:
  assumes crd: "card (UNIV::('a::finite) set) < card (S::'a set) + card (T::'a set)"
  obtains p where "p ∈ S" and "p ∈ T"
using crd majorities_intersect by blast
lemma majoritiesE':
  assumes S: "card (S::('a::finite) set) > (card (UNIV::'a set)) div 2"
  and T: "card (T::'a set) > (card (UNIV::'a set)) div 2"
  obtains p where "p ∈ S" and "p ∈ T"
by (rule abs_majoritiesE'[OF S T]) auto
end