Theorem: CategoryTheory.Functor.eventually_injective
File: Mathlib/CategoryTheory/CofilteredSystem.lean

tactic: haveI : ∀ j, Fintype (F.obj j) := fun j => Fintype.ofFinite (F.obj j)
state_before: J : Type u
inst✝⁵ : Category J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), _root_.Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : _root_.Nonempty J
inst✝ : Finite ↑(sections F)
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)

tactic: haveI : Fintype F.sections := Fintype.ofFinite F.sections
state_before: J : Type u
inst✝⁵ : Category J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), _root_.Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : _root_.Nonempty J
inst✝ : Finite ↑(sections F)
this : (j : J) → Fintype (F.obj j)
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)

tactic: have card_le : ∀ j, Fintype.card (F.obj j) ≤ Fintype.card F.sections :=
  fun j => Fintype.card_le_of_surjective _ (F.eval_section_surjective_of_surjective Fsur j)
state_before: J : Type u
inst✝⁵ : Category J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), _root_.Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : _root_.Nonempty J
inst✝ : Finite ↑(sections F)
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑(sections F)
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)

tactic: let fn j := Fintype.card F.sections - Fintype.card (F.obj j)
state_before: J : Type u
inst✝⁵ : Category J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), _root_.Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : _root_.Nonempty J
inst✝ : Finite ↑(sections F)
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑(sections F)
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑(sections F)
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)

tactic: refine' ⟨fn.argmin Nat.lt_wfRel.wf,
  fun i f => ((Fintype.bijective_iff_surjective_and_card _).2
    ⟨Fsur f, le_antisymm _ (Fintype.card_le_of_surjective _ <| Fsur f)⟩).1⟩
state_before: J : Type u
inst✝⁵ : Category J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), _root_.Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : _root_.Nonempty J
inst✝ : Finite ↑(sections F)
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑(sections F)
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑(sections F)
fn : J → ℕ := fun j => Fintype.card ↑(sections F) - Fintype.card (F.obj j)
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)

tactic: rw [← Nat.sub_sub_self (card_le i), tsub_le_iff_tsub_le]
state_before: J : Type u
inst✝⁵ : Category J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), _root_.Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : _root_.Nonempty J
inst✝ : Finite ↑(sections F)
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑(sections F)
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑(sections F)
fn : J → ℕ := fun j => Fintype.card ↑(sections F) - Fintype.card (F.obj j)
i : J
f : i ⟶ Function.argmin fn (_ : WellFounded WellFoundedRelation.rel)
⊢ Fintype.card (F.obj i) ≤ Fintype.card (F.obj (Function.argmin fn (_ : WellFounded WellFoundedRelation.rel)))

tactic: apply fn.argmin_le
state_before: J : Type u
inst✝⁵ : Category J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), _root_.Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : _root_.Nonempty J
inst✝ : Finite ↑(sections F)
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑(sections F)
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑(sections F)
fn : J → ℕ := fun j => Fintype.card ↑(sections F) - Fintype.card (F.obj j)
i : J
f : i ⟶ Function.argmin fn (_ : WellFounded WellFoundedRelation.rel)
⊢ Fintype.card ↑(sections F) - Fintype.card (F.obj (Function.argmin fn (_ : WellFounded WellFoundedRelation.rel))) ≤
    Fintype.card ↑(sections F) - Fintype.card (F.obj i)