File: Mathlib/Combinatorics/SetFamily/LYM.lean

full_name: Finset.card_mul_le_card_shadow_mul
code: /-- The downward **local LYM inequality**, with cancelled denominators. `𝒜` takes up less of `α^(r)`
(the finsets of card `r`) than `∂𝒜` takes up of `α^(r - 1)`. -/
theorem card_mul_le_card_shadow_mul (h𝒜 : (𝒜 : Set (Finset α)).Sized r) :
    𝒜.card * r ≤ (∂ 𝒜).card * (Fintype.card α - r + 1) 
goal: 𝒜.card * r ≤ (∂ 𝒜).card * (Fintype.card α - r + 1)

full_name: Finset.card_div_choose_le_card_shadow_div_choose
code: /-- The downward **local LYM inequality**. `𝒜` takes up less of `α^(r)` (the finsets of card `r`)
than `∂𝒜` takes up of `α^(r - 1)`. -/
theorem card_div_choose_le_card_shadow_div_choose (hr : r ≠ 0)
    (h𝒜 : (𝒜 : Set (Finset α)).Sized r) : (𝒜.card : 𝕜) / (Fintype.card α).choose r
    ≤ (∂ 𝒜).card / (Fintype.card α).choose (r - 1) 
goal: ↑𝒜.card / ↑((Fintype.card α).choose r) ≤ ↑(∂ 𝒜).card / ↑((Fintype.card α).choose (r - 1))

full_name: Finset.falling
code: /-- `falling k 𝒜` is all the finsets of cardinality `k` which are a subset of something in `𝒜`. -/
def falling : Finset (Finset α) 
goal: Finset (Finset α)

full_name: Finset.mem_falling
code: theorem mem_falling : s ∈ falling k 𝒜 ↔ (∃ t ∈ 𝒜, s ⊆ t) ∧ s.card = k 
goal: s ∈ Finset.falling k 𝒜 ↔ (∃ t ∈ 𝒜, s ⊆ t) ∧ s.card = k

full_name: Finset.sized_falling
code: theorem sized_falling : (falling k 𝒜 : Set (Finset α)).Sized k 
goal: Set.Sized k ↑(Finset.falling k 𝒜)

full_name: Finset.slice_subset_falling
code: theorem slice_subset_falling : 𝒜 # k ⊆ falling k 𝒜 
goal: 𝒜 # k ⊆ Finset.falling k 𝒜

full_name: Finset.falling_zero_subset
code: theorem falling_zero_subset : falling 0 𝒜 ⊆ {∅} 
goal: Finset.falling 0 𝒜 ⊆ {∅}

full_name: Finset.slice_union_shadow_falling_succ
code: theorem slice_union_shadow_falling_succ : 𝒜 # k ∪ ∂ (falling (k + 1) 𝒜) = falling k 𝒜 
goal: 𝒜 # k ∪ ∂ (Finset.falling (k + 1) 𝒜) = Finset.falling k 𝒜

full_name: Finset.IsAntichain.disjoint_slice_shadow_falling
code: /-- The shadow of `falling m 𝒜` is disjoint from the `n`-sized elements of `𝒜`, thanks to the
antichain property. -/
theorem IsAntichain.disjoint_slice_shadow_falling {m n : ℕ}
    (h𝒜 : IsAntichain (· ⊆ ·) (𝒜 : Set (Finset α))) : Disjoint (𝒜 # m) (∂ (falling n 𝒜)) 
goal: Disjoint (𝒜 # m) (∂ (Finset.falling n 𝒜))

full_name: Finset.le_card_falling_div_choose
code: /-- A bound on any top part of the sum in LYM in terms of the size of `falling k 𝒜`. -/
theorem le_card_falling_div_choose [Fintype α] (hk : k ≤ Fintype.card α)
    (h𝒜 : IsAntichain (· ⊆ ·) (𝒜 : Set (Finset α))) :
    (∑ r ∈ range (k + 1),
        ((𝒜 # (Fintype.card α - r)).card : 𝕜) / (Fintype.card α).choose (Fintype.card α - r)) ≤
      (falling (Fintype.card α - k) 𝒜).card / (Fintype.card α).choose (Fintype.card α - k) 
goal: ∑ r ∈ Finset.range (k + 1), ↑(𝒜 # (Fintype.card α - r)).card / ↑((Fintype.card α).choose (Fintype.card α - r)) ≤
  ↑(Finset.falling (Fintype.card α - k) 𝒜).card / ↑((Fintype.card α).choose (Fintype.card α - k))

full_name: Finset.sum_card_slice_div_choose_le_one
code: /-- The **Lubell-Yamamoto-Meshalkin inequality**. If `𝒜` is an antichain, then the sum of the
proportion of elements it takes from each layer is less than `1`. -/
theorem sum_card_slice_div_choose_le_one [Fintype α]
    (h𝒜 : IsAntichain (· ⊆ ·) (𝒜 : Set (Finset α))) :
    (∑ r ∈ range (Fintype.card α + 1), ((𝒜 # r).card : 𝕜) / (Fintype.card α).choose r) ≤ 1 
goal: ∑ r ∈ Finset.range (Fintype.card α + 1), ↑(𝒜 # r).card / ↑((Fintype.card α).choose r) ≤ 1

full_name: Finset.IsAntichain.sperner
code: /-- **Sperner's theorem**. The size of an antichain in `Finset α` is bounded by the size of the
maximal layer in `Finset α`. This precisely means that `Finset α` is a Sperner order. -/
theorem IsAntichain.sperner [Fintype α] {𝒜 : Finset (Finset α)}
    (h𝒜 : IsAntichain (· ⊆ ·) (𝒜 : Set (Finset α))) :
    𝒜.card ≤ (Fintype.card α).choose (Fintype.card α / 2) 
goal: 𝒜.card ≤ (Fintype.card α).choose (Fintype.card α / 2)