Theorem: Set.exists_subset_mul_div
File: Mathlib/Combinatorics/Additive/RuzsaCovering.lean

tactic: lift s to Finset α using hs
state_before: α : Type u_1
inst✝ : CommGroup α
s t : Set α
hs : s.Finite
ht' : t.Finite
ht : t.Nonempty
⊢ ∃ u, Nat.card ↑u * Nat.card ↑t ≤ Nat.card ↑(s * t) ∧ s ⊆ u * t / t ∧ u.Finite
state_after: case intro
α : Type u_1
inst✝ : CommGroup α
t : Set α
ht' : t.Finite
ht : t.Nonempty
s : Finset α
⊢ ∃ u, Nat.card ↑u * Nat.card ↑t ≤ Nat.card ↑(↑s * t) ∧ ↑s ⊆ u * t / t ∧ u.Finite

tactic: lift t to Finset α using ht'
state_before: case intro
α : Type u_1
inst✝ : CommGroup α
t : Set α
ht' : t.Finite
ht : t.Nonempty
s : Finset α
⊢ ∃ u, Nat.card ↑u * Nat.card ↑t ≤ Nat.card ↑(↑s * t) ∧ ↑s ⊆ u * t / t ∧ u.Finite
state_after: case intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
⊢ ∃ u, Nat.card ↑u * Nat.card ↑↑t ≤ Nat.card ↑(↑s * ↑t) ∧ ↑s ⊆ u * ↑t / ↑t ∧ u.Finite

tactic: classical
obtain ⟨u, hu, hsut⟩ := Finset.exists_subset_mul_div s ht
refine ⟨u, ?_⟩
rw [← Finset.coe_mul, ← Finset.coe_mul, ← Finset.coe_div]
norm_cast
simp [*]
state_before: case intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
⊢ ∃ u, Nat.card ↑u * Nat.card ↑↑t ≤ Nat.card ↑(↑s * ↑t) ∧ ↑s ⊆ u * ↑t / ↑t ∧ u.Finite
state_after: no goals

tactic: obtain ⟨u, hu, hsut⟩ := Finset.exists_subset_mul_div s ht
state_before: case intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
⊢ ∃ u, Nat.card ↑u * Nat.card ↑↑t ≤ Nat.card ↑(↑s * ↑t) ∧ ↑s ⊆ u * ↑t / ↑t ∧ u.Finite
state_after: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ ∃ u, Nat.card ↑u * Nat.card ↑↑t ≤ Nat.card ↑(↑s * ↑t) ∧ ↑s ⊆ u * ↑t / ↑t ∧ u.Finite

tactic: refine ⟨u, ?_⟩
state_before: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ ∃ u, Nat.card ↑u * Nat.card ↑↑t ≤ Nat.card ↑(↑s * ↑t) ∧ ↑s ⊆ u * ↑t / ↑t ∧ u.Finite
state_after: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ Nat.card ↑↑u * Nat.card ↑↑t ≤ Nat.card ↑(↑s * ↑t) ∧ ↑s ⊆ ↑u * ↑t / ↑t ∧ (↑u).Finite

tactic: rw [← Finset.coe_mul, ← Finset.coe_mul, ← Finset.coe_div]
state_before: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ Nat.card ↑↑u * Nat.card ↑↑t ≤ Nat.card ↑(↑s * ↑t) ∧ ↑s ⊆ ↑u * ↑t / ↑t ∧ (↑u).Finite
state_after: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ Nat.card ↑↑u * Nat.card ↑↑t ≤ Nat.card ↑↑(s * t) ∧ ↑s ⊆ ↑(u * t / t) ∧ (↑u).Finite

tactic: norm_cast
state_before: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ Nat.card ↑↑u * Nat.card ↑↑t ≤ Nat.card ↑↑(s * t) ∧ ↑s ⊆ ↑(u * t / t) ∧ (↑u).Finite
state_after: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ Nat.card { x // x ∈ u } * Nat.card { x // x ∈ t } ≤ Nat.card { x // x ∈ s * t } ∧ s ⊆ u * t / t ∧ (↑u).Finite

tactic: simp [*]
state_before: case intro.intro.intro.intro
α : Type u_1
inst✝ : CommGroup α
s t : Finset α
ht : (↑t).Nonempty
u : Finset α
hu : u.card * t.card ≤ (s * t).card
hsut : s ⊆ u * t / t
⊢ Nat.card { x // x ∈ u } * Nat.card { x // x ∈ t } ≤ Nat.card { x // x ∈ s * t } ∧ s ⊆ u * t / t ∧ (↑u).Finite
state_after: no goals