Theorem: Finset.le_card_falling_div_choose
File: Mathlib/Combinatorics/SetFamily/LYM.lean

tactic: induction' k with k ih
state_before: 𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
hk : k ≤ Fintype.card α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
⊢ ∑ 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))
state_after: case zero
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
hk : 0 ≤ Fintype.card α
⊢ ∑ r ∈ range (0 + 1), ↑(𝒜 # (Fintype.card α - r)).card / ↑((Fintype.card α).choose (Fintype.card α - r)) ≤
    ↑(falling (Fintype.card α - 0) 𝒜).card / ↑((Fintype.card α).choose (Fintype.card α - 0))

case succ
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k✝ : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
k : ℕ
ih :
  k ≤ Fintype.card α →
    ∑ 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))
hk : k + 1 ≤ Fintype.card α
⊢ ∑ r ∈ range (k + 1 + 1), ↑(𝒜 # (Fintype.card α - r)).card / ↑((Fintype.card α).choose (Fintype.card α - r)) ≤
    ↑(falling (Fintype.card α - (k + 1)) 𝒜).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1)))

tactic: rw [sum_range_succ, ← slice_union_shadow_falling_succ,
  card_union_of_disjoint (IsAntichain.disjoint_slice_shadow_falling h𝒜), cast_add, _root_.add_div,
  add_comm]
state_before: case succ
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k✝ : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
k : ℕ
ih :
  k ≤ Fintype.card α →
    ∑ 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))
hk : k + 1 ≤ Fintype.card α
⊢ ∑ r ∈ range (k + 1 + 1), ↑(𝒜 # (Fintype.card α - r)).card / ↑((Fintype.card α).choose (Fintype.card α - r)) ≤
    ↑(falling (Fintype.card α - (k + 1)) 𝒜).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1)))
state_after: case succ
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k✝ : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
k : ℕ
ih :
  k ≤ Fintype.card α →
    ∑ 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))
hk : k + 1 ≤ Fintype.card α
⊢ ↑(𝒜 # (Fintype.card α - (k + 1))).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1))) +
      ∑ x ∈ range (k + 1), ↑(𝒜 # (Fintype.card α - x)).card / ↑((Fintype.card α).choose (Fintype.card α - x)) ≤
    ↑(𝒜 # (Fintype.card α - (k + 1))).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1))) +
      ↑(∂ (falling (Fintype.card α - (k + 1) + 1) 𝒜)).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1)))

tactic: rw [← tsub_tsub, tsub_add_cancel_of_le (le_tsub_of_add_le_left hk)]
state_before: case succ
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k✝ : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
k : ℕ
ih :
  k ≤ Fintype.card α →
    ∑ 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))
hk : k + 1 ≤ Fintype.card α
⊢ ↑(𝒜 # (Fintype.card α - (k + 1))).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1))) +
      ∑ x ∈ range (k + 1), ↑(𝒜 # (Fintype.card α - x)).card / ↑((Fintype.card α).choose (Fintype.card α - x)) ≤
    ↑(𝒜 # (Fintype.card α - (k + 1))).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1))) +
      ↑(∂ (falling (Fintype.card α - (k + 1) + 1) 𝒜)).card / ↑((Fintype.card α).choose (Fintype.card α - (k + 1)))
state_after: case succ
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k✝ : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
k : ℕ
ih :
  k ≤ Fintype.card α →
    ∑ 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))
hk : k + 1 ≤ Fintype.card α
⊢ ↑(𝒜 # (Fintype.card α - k - 1)).card / ↑((Fintype.card α).choose (Fintype.card α - k - 1)) +
      ∑ x ∈ range (k + 1), ↑(𝒜 # (Fintype.card α - x)).card / ↑((Fintype.card α).choose (Fintype.card α - x)) ≤
    ↑(𝒜 # (Fintype.card α - k - 1)).card / ↑((Fintype.card α).choose (Fintype.card α - k - 1)) +
      ↑(∂ (falling (Fintype.card α - k) 𝒜)).card / ↑((Fintype.card α).choose (Fintype.card α - k - 1))

tactic: exact
  add_le_add_left
    ((ih <| le_of_succ_le hk).trans <|
      card_div_choose_le_card_shadow_div_choose (tsub_pos_iff_lt.2 <| Nat.succ_le_iff.1 hk).ne' <|
        sized_falling _ _) _
state_before: case succ
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k✝ : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
k : ℕ
ih :
  k ≤ Fintype.card α →
    ∑ 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))
hk : k + 1 ≤ Fintype.card α
⊢ ↑(𝒜 # (Fintype.card α - k - 1)).card / ↑((Fintype.card α).choose (Fintype.card α - k - 1)) +
      ∑ x ∈ range (k + 1), ↑(𝒜 # (Fintype.card α - x)).card / ↑((Fintype.card α).choose (Fintype.card α - x)) ≤
    ↑(𝒜 # (Fintype.card α - k - 1)).card / ↑((Fintype.card α).choose (Fintype.card α - k - 1)) +
      ↑(∂ (falling (Fintype.card α - k) 𝒜)).card / ↑((Fintype.card α).choose (Fintype.card α - k - 1))
state_after: no goals

tactic: simp only [tsub_zero, cast_one, cast_le, sum_singleton, div_one, choose_self, range_one,
  zero_eq, zero_add, range_one, ge_iff_le, sum_singleton, nonpos_iff_eq_zero, tsub_zero,
  choose_self, cast_one, div_one, cast_le]
state_before: case zero
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
hk : 0 ≤ Fintype.card α
⊢ ∑ r ∈ range (0 + 1), ↑(𝒜 # (Fintype.card α - r)).card / ↑((Fintype.card α).choose (Fintype.card α - r)) ≤
    ↑(falling (Fintype.card α - 0) 𝒜).card / ↑((Fintype.card α).choose (Fintype.card α - 0))
state_after: case zero
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
hk : 0 ≤ Fintype.card α
⊢ (𝒜 # Fintype.card α).card ≤ (falling (Fintype.card α) 𝒜).card

tactic: exact card_le_card (slice_subset_falling _ _)
state_before: case zero
𝕜 : Type u_1
α : Type u_2
inst✝² : LinearOrderedField 𝕜
inst✝¹ : DecidableEq α
k : ℕ
𝒜 : Finset (Finset α)
s : Finset α
inst✝ : Fintype α
h𝒜 : IsAntichain (fun x x_1 => x ⊆ x_1) ↑𝒜
hk : 0 ≤ Fintype.card α
⊢ (𝒜 # Fintype.card α).card ≤ (falling (Fintype.card α) 𝒜).card
state_after: no goals