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.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
state_after: J : Type u
inst✝⁵ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this : (j : J) → Fintype (F.obj j)
⊢ ∃ 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.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this : (j : J) → Fintype (F.obj j)
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
state_after: J : Type u
inst✝⁵ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑F.sections
⊢ ∃ 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.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑F.sections
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
state_after: J : Type u
inst✝⁵ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑F.sections
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑F.sections
⊢ ∃ 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.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑F.sections
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑F.sections
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
state_after: J : Type u
inst✝⁵ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑F.sections
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑F.sections
fn : J → ℕ := fun j => Fintype.card ↑F.sections - Fintype.card (F.obj j)
⊢ ∃ 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.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑F.sections
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑F.sections
fn : J → ℕ := fun j => Fintype.card ↑F.sections - Fintype.card (F.obj j)
⊢ ∃ j, ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
state_after: J : Type u
inst✝⁵ : Category.{u_1, u} J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝⁴ : IsCofilteredOrEmpty J
inst✝³ : ∀ (j : J), Nonempty (F.obj j)
inst✝² : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
inst✝¹ : Nonempty J
inst✝ : Finite ↑F.sections
this✝ : (j : J) → Fintype (F.obj j)
this : Fintype ↑F.sections
card_le : ∀ (j : J), Fintype.card (F.obj j) ≤ Fintype.card ↑F.sections
fn : J → ℕ := fun j => Fintype.card ↑F.sections - Fintype.card (F.obj j)
i : J
f : i ⟶ Function.argmin fn ⋯
⊢ Fintype.card (F.obj i) ≤ Fintype.card (F.obj (Function.argmin fn ⋯))

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

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