Documentation

EconCSLib.SocialChoice.FairDivision.Divisible.Existence

EconCSLib.SocialChoice.FairDivision.Divisible.Existence #

Existence theorems for envy-free complete divisible allocations.

Main results #

Proof strategy for ef_exists (Stromquist 1980) #

We follow the proof of Stromquist, "How to Cut a Cake Fairly", Amer. Math. Monthly 87 (1980).

Setup #

The division simplex S = stdSimplex (Fin n) is the standard (n-1)-simplex. A point xS represents a way to divide the cake into n consecutive pieces: coordinate xᵢ0 encodes the "fractional length" of the i-th piece, and xᵢ = 1. The actual cut points in are recovered via a fixed homeomorphism φ : (0,1) ≃ₜ ; the i-th piece is φ((∑_{j<i} xⱼ, ∑_{j≤i} xⱼ]).

The face opposite vertex i is simplexFaceOpp i = {x ∈ S | xᵢ = 0}, the set of divisions where piece i is empty.

Key definitions #

For each agent j : Fin n and piece index i : Fin n:

Proof by KKM #

The proof splits into two cases:

Usual case (strom_U covers S): Apply kkm_open_cover to obtain a point x* ∈ ⋂ᵢ strom_U i. At x*, each piece i has a unique claimant among the agents, and the claimants are all distinct (since strom_B i j and strom_B i j' are disjoint for jj'). Assigning each agent their uniquely preferred piece yields an EF allocation.

Unusual case (strom_U does not cover S): Any uncovered division x has every agent indifferent between two or more pieces. We eliminate this by approximating the strom_A i j sets: choose irrationals α₀, …, αₙ₋₁ linearly independent over , and for a large M define modified preference sets strom_A' i j by intersecting strom_A i j with the half-open cells {x | xₖ ∈ [L/M + αⱼ, (L+1)/M + αⱼ)}. The resulting strom_U' sets DO cover S (the irrationality prevents coincidences), so the usual case applies. As M → ∞, the approximate fair divisions converge (by compactness of S) to a fair division for the original preferences.

References #

Proportional existence #

Proportional allocations always exist for n agents with non-atomic finite measures on [0,1].

A proportional allocation assigns each agent a piece they value at ≥ 1/n of the total cake.

Proof sketch (moving knife, proportional variant):

By induction on n = Fintype.card N.

Base case (n = 1): The single agent receives the entire cake.

Inductive step: Given n agents, find a cut point t* ∈ [0,1] such that μ₀([0, t*]) = μ₀([0,1])/n. Assign agent 0 the piece [0, t*], which they value at exactly 1/n. Apply the inductive hypothesis to the remaining n-1 agents on (t*, 1], scaled to 1/(n-1) of the remainder.

Each agent's piece has value ≥ 1/n of their total measure on [0,1]:

  • Agent 0's piece: exactly μ₀([0,1])/n by construction.
  • Agent i > 0 (inductive hypothesis on restricted measures): value ≥ 1/(n-1) of remainder. Since the remainder has value ≥ (n-1)/n * μᵢ([0,1]) for agent i (they didn't cut, so the cut was possibly suboptimal for them), we get value ≥ 1/(n-1) * (n-1)/n * μᵢ([0,1]) = 1/n * μᵢ([0,1]).

Key Lean ingredients:

Proof: apply dubinsSpanierProportional with the measure family reindexed along the bijection e := Fintype.equivFin N, then transport the allocation back along e.

EF existence: Stromquist scaffolding #

This section develops the scaffolding for the Stromquist proof of ef_exists, following Stromquist (1980). The main components are:

  1. The piece function strom_piece: maps a simplex point and a piece index to a subset of ℝ.
  2. The value function strom_value: evaluates a measure on a piece.
  3. The preference sets strom_A, strom_B, strom_U: closed/open subsets of the simplex encoding agent preferences.
  4. The KKM application and the assignment of pieces to agents.

Design note: strom_A i j is defined on all of Fin n (not restricted to the simplex). This ensures strom_B i j is genuinely open in the ambient space, which is required for the KKM open-cover theorem. The simplex constraint appears explicitly only in strom_A_covers and the KKM application.

Piece function and partition #

noncomputable def SocialChoice.FairDivision.Divisible.strom_piece (n : ) (x : Fin n) (i : Fin n) :

The i-th piece at division x: the subset of assigned to piece i when the cake is divided according to xstdSimplex (Fin n).

Construction: Fix a homeomorphism φ : (0,1) ≃ₜ (e.g., φ(t) = tan(π(t - 1/2))). At division x, the i-th piece is φ((∑_{j<i} xⱼ, ∑_{j≤i} xⱼ]).

Equivalently for measures supported on [0,1]: piece i is the interval (∑_{j<i} xⱼ, ∑_{j≤i} xⱼ] in [0,1].

The key properties (stated as separate lemmas below) are:

Equations
Instances For
    theorem SocialChoice.FairDivision.Divisible.strom_piece_partition (n : ) (x : Fin n) (hx : x stdSimplex (Fin n)) :
    (∀ (i : Fin n), MeasurableSet (strom_piece n x i)) (∀ (i j : Fin n), i jDisjoint (strom_piece n x i) (strom_piece n x j)) ⋃ (i : Fin n), strom_piece n x i = Set.Ico 0 1

    The pieces at any division xstdSimplex (Fin n) form a measurable partition of Set.Ico 0 1. (They do not cover all of ℝ; see strom_usual_case for how the complement is handled when constructing a IsAllocation.)

    theorem SocialChoice.FairDivision.Divisible.strom_piece_empty_iff (n : ) (x : Fin n) (hx : x stdSimplex (Fin n)) (i : Fin n) :
    strom_piece n x i = x i = 0

    Piece i is empty (measure zero for all agents) if and only if xᵢ = 0.

    This is the measure-theoretic content of "face i corresponds to piece i being empty": at a point x in simplexFaceOpp i, the piece strom_piece n x i contains no mass.

    Value function and its continuity #

    noncomputable def SocialChoice.FairDivision.Divisible.strom_value (n : ) (μ : Fin nMeasureTheory.Measure ) (x : Fin n) (j i : Fin n) :

    The value agent j assigns to piece i at division x: strom_value μ x j i = μ j (strom_piece n x i).

    Equations
    Instances For
      theorem SocialChoice.FairDivision.Divisible.strom_value_continuous (n : ) (μ : Fin nMeasureTheory.Measure ) [∀ (i : Fin n), MeasureTheory.IsFiniteMeasure (μ i)] [∀ (i : Fin n), MeasureTheory.NoAtoms (μ i)] (j i : Fin n) :
      Continuous fun (x : Fin n) => strom_value n μ x j i

      The value function xstrom_value μ x j i is continuous on all of Fin n.

      Proof: The piece endpoints l(x) = ∑_{k<i} xk and r(x) = ∑_{k≤i} xk are linear (hence continuous) in x. The measure of the piece equals max (CDF_j(r(x)) - CDF_j(l(x))) 0 where CDF_j is the continuous CDF of μ j (continuous by cdfRealContinuous). The composition is continuous.

      Preference sets #

      Unique preference sets #

      Agent preference union #

      The usual case: KKM gives a fair assignment #

      The unusual case: shifted coordinate cells #

      Helper lemmas for the unusual case #

      EF existence (general n agents) #

      EF allocations always exist for any finite number of agents with non-atomic finite measures on [0,1].

      This is the fundamental existence theorem of divisible fair division (Stromquist 1980).

      Proof (via Stromquist's KKM argument, sketched):

      1. Push each measure on [0,1] forward along Subtype.val : I.
      2. Reindex agents as Fin n (n = Fintype.card N) via Fintype.equivFin N.
      3. Apply strom_unusual_case to get an EF allocation for Fin n agents. (strom_unusual_case subsumes the usual case: it handles both via the approximation argument, which reduces to strom_usual_case when the U sets already cover the simplex.)
      4. Pull the allocation back to [0,1] along Subtype.val and transport it back along the bijection.

      See the module docstring for the full proof strategy.

      Corollaries #

      EF implies proportional (corollary of IsEnvyFree.isProportional): the EF allocation produced by ef_exists is also proportional.

      This is an immediate consequence of IsEnvyFree.isProportional, recorded here as a standalone corollary for convenience.

      Bundled measure-instance entrypoints #

      Proportional existence for bundled measure instances on [0,1].

      Envy-free existence for bundled measure instances on [0,1].

      Combined envy-free and proportional existence for bundled measure instances on [0,1].