Theorem: Set.ncard_eq_of_bijective
File: Mathlib/Data/Set/Card.lean

tactic: let f' : Fin n → α := fun i ↦ f i.val i.is_lt
state_before: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
⊢ s.ncard = n
state_after: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
⊢ s.ncard = n

tactic: suffices himage : s = f' '' Set.univ by
  rw [← Fintype.card_fin n, ← Nat.card_eq_fintype_card, ← Set.ncard_univ, himage]
  exact ncard_image_of_injOn <| fun i _hi j _hj h ↦ Fin.ext <| f_inj i.val j.val i.is_lt j.is_lt h
state_before: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
⊢ s.ncard = n
state_after: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
⊢ s = f' '' univ

tactic: ext x
state_before: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
⊢ s = f' '' univ
state_after: case h
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
x : α
⊢ x ∈ s ↔ x ∈ f' '' univ

tactic: simp only [image_univ, mem_range]
state_before: case h
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
x : α
⊢ x ∈ s ↔ x ∈ f' '' univ
state_after: case h
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
x : α
⊢ x ∈ s ↔ ∃ y, f' y = x

tactic: refine ⟨fun hx ↦ ?_, fun ⟨⟨i, hi⟩, hx⟩ ↦ hx ▸ hf' i hi⟩
state_before: case h
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
x : α
⊢ x ∈ s ↔ ∃ y, f' y = x
state_after: case h
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
x : α
hx : x ∈ s
⊢ ∃ y, f' y = x

tactic: obtain ⟨i, hi, rfl⟩ := hf x hx
state_before: case h
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
x : α
hx : x ∈ s
⊢ ∃ y, f' y = x
state_after: case h.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
i : ℕ
hi : i < n
hx : f i hi ∈ s
⊢ ∃ y, f' y = f i hi

tactic: use ⟨i, hi⟩
state_before: case h.intro.intro
α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
i : ℕ
hi : i < n
hx : f i hi ∈ s
⊢ ∃ y, f' y = f i hi
state_after: no goals

tactic: rw [← Fintype.card_fin n, ← Nat.card_eq_fintype_card, ← Set.ncard_univ, himage]
state_before: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
himage : s = f' '' univ
⊢ s.ncard = n
state_after: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
himage : s = f' '' univ
⊢ (f' '' univ).ncard = univ.ncard

tactic: exact ncard_image_of_injOn <| fun i _hi j _hj h ↦ Fin.ext <| f_inj i.val j.val i.is_lt j.is_lt h
state_before: α : Type u_1
β : Type u_2
s t : Set α
f✝ : α → β
n : ℕ
f : (i : ℕ) → i < n → α
hf : ∀ a ∈ s, ∃ i, ∃ (h : i < n), f i h = a
hf' : ∀ (i : ℕ) (h : i < n), f i h ∈ s
f_inj : ∀ (i j : ℕ) (hi : i < n) (hj : j < n), f i hi = f j hj → i = j
f' : Fin n → α := fun i => f ↑i ⋯
himage : s = f' '' univ
⊢ (f' '' univ).ncard = univ.ncard
state_after: no goals