Theorem: Finset.injOn_of_card_image_eq
File: Mathlib/Data/Finset/Card.lean

tactic: rw [card_def, card_def, image, toFinset] at H
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : (image f s).card = s.card
⊢ Set.InjOn f ↑s
state_after: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card { val := (Multiset.map f s.val).dedup, nodup := ⋯ }.val = Multiset.card s.val
⊢ Set.InjOn f ↑s

tactic: dsimp only at H
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card { val := (Multiset.map f s.val).dedup, nodup := ⋯ }.val = Multiset.card s.val
⊢ Set.InjOn f ↑s
state_after: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
⊢ Set.InjOn f ↑s

tactic: have : (s.1.map f).dedup = s.1.map f := by
  refine Multiset.eq_of_le_of_card_le (Multiset.dedup_le _) ?_
  simp only [H, Multiset.card_map, le_rfl]
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
⊢ Set.InjOn f ↑s
state_after: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
this : (Multiset.map f s.val).dedup = Multiset.map f s.val
⊢ Set.InjOn f ↑s

tactic: rw [Multiset.dedup_eq_self] at this
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
this : (Multiset.map f s.val).dedup = Multiset.map f s.val
⊢ Set.InjOn f ↑s
state_after: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
this : (Multiset.map f s.val).Nodup
⊢ Set.InjOn f ↑s

tactic: exact inj_on_of_nodup_map this
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
this : (Multiset.map f s.val).Nodup
⊢ Set.InjOn f ↑s
state_after: no goals

tactic: refine Multiset.eq_of_le_of_card_le (Multiset.dedup_le _) ?_
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
⊢ (Multiset.map f s.val).dedup = Multiset.map f s.val
state_after: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
⊢ Multiset.card (Multiset.map f s.val) ≤ Multiset.card (Multiset.map f s.val).dedup

tactic: simp only [H, Multiset.card_map, le_rfl]
state_before: α : Type u_1
β : Type u_2
R : Type u_3
s t u : Finset α
f : α → β
n : ℕ
inst✝ : DecidableEq β
H : Multiset.card (Multiset.map f s.val).dedup = Multiset.card s.val
⊢ Multiset.card (Multiset.map f s.val) ≤ Multiset.card (Multiset.map f s.val).dedup
state_after: no goals