Theorem: Finset.card_add_nsmul_le
File: Mathlib/Combinatorics/Additive/PluenneckeRuzsa.lean

tactic: obtain rfl | hA := A.eq_empty_or_nonempty
state_before: α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
n : ℕ
⊢ ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
state_after: case inl
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
B : Finset α
n : ℕ
hAB : ∀ A' ⊆ ∅, (∅ + B).card * A'.card ≤ (A' + B).card * ∅.card
⊢ ↑(∅ + n • B).card ≤ (↑(∅ + B).card / ↑∅.card) ^ n * ↑∅.card

case inr
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
n : ℕ
hA : A.Nonempty
⊢ ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card

tactic: induction' n with n ih
state_before: case inr
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
n : ℕ
hA : A.Nonempty
⊢ ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
state_after: case inr.zero
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
⊢ ↑(A + 0 • B).card ≤ (↑(A + B).card / ↑A.card) ^ 0 * ↑A.card

case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A + (n + 1) • B).card ≤ (↑(A + B).card / ↑A.card) ^ (n + 1) * ↑A.card

tactic: rw [succ_nsmul', ← add_assoc, _root_.pow_succ', mul_assoc, ← mul_div_right_comm, le_div_iff,
  ← cast_mul]
state_before: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A + (n + 1) • B).card ≤ (↑(A + B).card / ↑A.card) ^ (n + 1) * ↑A.card
state_after: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A + B + n • B).card * A.card) ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)

case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ 0 < ↑A.card

tactic: swap
state_before: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A + B + n • B).card * A.card) ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)

case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ 0 < ↑A.card
state_after: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ 0 < ↑A.card

case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A + B + n • B).card * A.card) ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)

tactic: refine (Nat.cast_le.2 <| add_pluennecke_petridis _ hAB).trans ?_
state_before: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A + B + n • B).card * A.card) ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)
state_after: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A + B).card * (A + n • B).card) ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)

tactic: rw [cast_mul]
state_before: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑((A + B).card * (A + n • B).card) ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)
state_after: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A + B).card * ↑(A + n • B).card ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)

tactic: gcongr
state_before: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ ↑(A + B).card * ↑(A + n • B).card ≤ ↑(A + B).card * ((↑(A + B).card / ↑A.card) ^ n * ↑A.card)
state_after: no goals

tactic: simp
state_before: case inl
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
B : Finset α
n : ℕ
hAB : ∀ A' ⊆ ∅, (∅ + B).card * A'.card ≤ (A' + B).card * ∅.card
⊢ ↑(∅ + n • B).card ≤ (↑(∅ + B).card / ↑∅.card) ^ n * ↑∅.card
state_after: no goals

tactic: simp
state_before: case inr.zero
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
⊢ ↑(A + 0 • B).card ≤ (↑(A + B).card / ↑A.card) ^ 0 * ↑A.card
state_after: no goals

tactic: exact cast_pos.2 hA.card_pos
state_before: case inr.succ
α✝ : Type u_1
inst✝³ : CommGroup α✝
inst✝² : DecidableEq α✝
A✝ B✝ C : Finset α✝
α : Type u_2
inst✝¹ : AddCommGroup α
inst✝ : DecidableEq α
A B : Finset α
hAB : ∀ A' ⊆ A, (A + B).card * A'.card ≤ (A' + B).card * A.card
hA : A.Nonempty
n : ℕ
ih : ↑(A + n • B).card ≤ (↑(A + B).card / ↑A.card) ^ n * ↑A.card
⊢ 0 < ↑A.card
state_after: no goals