Theorem: _private.Mathlib.Combinatorics.Additive.PluenneckeRuzsa.0.Finset.mul_aux
File: Mathlib/Combinatorics/Additive/PluenneckeRuzsa.lean

Proof steps:
state_before: α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
⊢ ∀ A' ⊆ A, (A * C).card * A'.card ≤ (A' * C).card * A.card
state_after: α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
tactic: rintro A' hAA'
state_before: α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
state_after: case inl
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
hAA' : ∅ ⊆ A
⊢ (A * C).card * ∅.card ≤ (∅ * C).card * A.card

case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
hA' : A'.Nonempty
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
tactic: obtain rfl | hA' := A'.eq_empty_or_nonempty
state_before: case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
hA' : A'.Nonempty
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
state_after: case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
hA' : A'.Nonempty
hA₀ : 0 < ↑A.card
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
tactic: have hA₀ : (0 : ℚ≥0) < A.card := cast_pos.2 hA.card_pos
state_before: case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
hA' : A'.Nonempty
hA₀ : 0 < ↑A.card
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
state_after: case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
hA' : A'.Nonempty
hA₀ : 0 < ↑A.card
hA₀' : 0 < ↑A'.card
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
tactic: have hA₀' : (0 : ℚ≥0) < A'.card := cast_pos.2 hA'.card_pos
state_before: case inr
α : Type u_1
inst✝¹ : CommGroup α
inst✝ : DecidableEq α
A B C : Finset α
hA : A.Nonempty
hAB : A ⊆ B
h : ∀ A' ∈ B.powerset.erase ∅, ↑(A * C).card / ↑A.card ≤ ↑(A' * C).card / ↑A'.card
A' : Finset α
hAA' : A' ⊆ A
hA' : A'.Nonempty
hA₀ : 0 < ↑A.card
hA₀' : 0 < ↑A'.card
⊢ (A * C).card * A'.card ≤ (A' * C).card * A.card
state_after: no goals
tactic: exact mod_cast
    (div_le_div_iff hA₀ hA₀').1
      (h _ <| mem_erase_of_ne_of_mem hA'.ne_empty <| mem_powerset.2 <| hAA'.trans hAB)