[GOAL]
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), _root_.Nonempty (F.obj j)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
let F' : J ⥤ TopCat := F ⋙ TopCat.discrete
[GOAL]
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), _root_.Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
haveI : ∀ j, DiscreteTopology (F'.obj j) := fun _ => ⟨rfl⟩
[GOAL]
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), _root_.Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
this : ∀ (j : J), DiscreteTopology ↑(F'.obj j)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
haveI : ∀ j, Finite (F'.obj j) := hf
[GOAL]
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), _root_.Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
this✝ : ∀ (j : J), DiscreteTopology ↑(F'.obj j)
this : ∀ (j : J), Finite ↑(F'.obj j)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
haveI : ∀ j, Nonempty (F'.obj j) := hne
[GOAL]
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), _root_.Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
this✝¹ : ∀ (j : J), DiscreteTopology ↑(F'.obj j)
this✝ : ∀ (j : J), Finite ↑(F'.obj j)
this : ∀ (j : J), _root_.Nonempty ↑(F'.obj j)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
obtain ⟨⟨u, hu⟩⟩ := TopCat.nonempty_limitCone_of_compact_t2_cofiltered_system.{u} F'
[GOAL]
case intro.mk
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsCofilteredOrEmpty J
F : J ⥤ Type u
hf : ∀ (j : J), Finite (F.obj j)
hne : ∀ (j : J), _root_.Nonempty (F.obj j)
F' : J ⥤ TopCat := F ⋙ TopCat.discrete
this✝¹ : ∀ (j : J), DiscreteTopology ↑(F'.obj j)
this✝ : ∀ (j : J), Finite ↑(F'.obj j)
this : ∀ (j : J), _root_.Nonempty ↑(F'.obj j)
u : (j : J) → ↑(F'.obj j)
hu : u ∈ {u | ∀ {i j : J} (f : i ⟶ j), ↑(F'.map f) (u i) = u j}
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
exact ⟨u, hu⟩
[GOAL]
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
let J' : Type max w v u := AsSmall.{max w v} J
[GOAL]
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
let down : J' ⥤ J := AsSmall.down
[GOAL]
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
let F' : J' ⥤ Type max u v w := down ⋙ F ⋙ uliftFunctor.{max u w, v}
[GOAL]
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
haveI : ∀ i, Nonempty (F'.obj i) := fun i => ⟨⟨Classical.arbitrary (F.obj (down.obj i))⟩⟩
[GOAL]
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this : ∀ (i : J'), _root_.Nonempty (F'.obj i)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
haveI : ∀ i, Finite (F'.obj i) := fun i => Finite.of_equiv (F.obj (down.obj i)) Equiv.ulift.symm
[GOAL]
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this : ∀ (i : J'), Finite (F'.obj i)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
cases isEmpty_or_nonempty J
[GOAL]
case inl
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this : ∀ (i : J'), Finite (F'.obj i)
h✝ : IsEmpty J
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
fconstructor
[GOAL]
case inl.w
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this : ∀ (i : J'), Finite (F'.obj i)
h✝ : IsEmpty J
⊢ (j : J) → F.obj j
[PROOFSTEP]
apply isEmptyElim
[GOAL]
case inl.h
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this : ∀ (i : J'), Finite (F'.obj i)
h✝ : IsEmpty J
⊢ isEmptyElim ∈ Functor.sections F
[PROOFSTEP]
apply isEmptyElim
[GOAL]
case inr
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this : ∀ (i : J'), Finite (F'.obj i)
h✝ : _root_.Nonempty J
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
haveI : IsCofiltered J := ⟨⟩
[GOAL]
case inr
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝¹ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this✝ : ∀ (i : J'), Finite (F'.obj i)
h✝ : _root_.Nonempty J
this : IsCofiltered J
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
obtain ⟨u, hu⟩ := nonempty_sections_of_finite_cofiltered_system.init F'
[GOAL]
case inr.intro
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝¹ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this✝ : ∀ (i : J'), Finite (F'.obj i)
h✝ : _root_.Nonempty J
this : IsCofiltered J
u : (j : J') → F'.obj j
hu : u ∈ Functor.sections F'
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
use fun j => (u ⟨j⟩).down
[GOAL]
case h
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝¹ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this✝ : ∀ (i : J'), Finite (F'.obj i)
h✝ : _root_.Nonempty J
this : IsCofiltered J
u : (j : J') → F'.obj j
hu : u ∈ Functor.sections F'
⊢ (fun j => (u { down := j }).down) ∈ Functor.sections F
[PROOFSTEP]
intro j j' f
[GOAL]
case h
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝¹ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this✝ : ∀ (i : J'), Finite (F'.obj i)
h✝ : _root_.Nonempty J
this : IsCofiltered J
u : (j : J') → F'.obj j
hu : u ∈ Functor.sections F'
j j' : J
f : j ⟶ j'
⊢ F.map f ((fun j => (u { down := j }).down) j) = (fun j => (u { down := j }).down) j'
[PROOFSTEP]
have h := @hu (⟨j⟩ : J') (⟨j'⟩ : J') (ULift.up f)
[GOAL]
case h
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝¹ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this✝ : ∀ (i : J'), Finite (F'.obj i)
h✝ : _root_.Nonempty J
this : IsCofiltered J
u : (j : J') → F'.obj j
hu : u ∈ Functor.sections F'
j j' : J
f : j ⟶ j'
h : F'.map { down := f } (u { down := j }) = u { down := j' }
⊢ F.map f ((fun j => (u { down := j }).down) j) = (fun j => (u { down := j }).down) j'
[PROOFSTEP]
simp only [AsSmall.down, Functor.comp_map, uliftFunctor_map, Functor.op_map] at h
[GOAL]
case h
J : Type u
inst✝³ : Category.{w, u} J
inst✝² : IsCofilteredOrEmpty J
F : J ⥤ Type v
inst✝¹ : ∀ (j : J), Finite (F.obj j)
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
J' : Type (max w v u) := AsSmall J
down : J' ⥤ J := AsSmall.down
F' : J' ⥤ Type (max u v w) := down ⋙ F ⋙ uliftFunctor.{max u w, v}
this✝¹ : ∀ (i : J'), _root_.Nonempty (F'.obj i)
this✝ : ∀ (i : J'), Finite (F'.obj i)
h✝ : _root_.Nonempty J
this : IsCofiltered J
u : (j : J') → F'.obj j
hu : u ∈ Functor.sections F'
j j' : J
f : j ⟶ j'
h : { down := F.map f (u { down := j }).down } = u { down := j' }
⊢ F.map f ((fun j => (u { down := j }).down) j) = (fun j => (u { down := j }).down) j'
[PROOFSTEP]
simp_rw [← h]
[GOAL]
J : Type u
inst✝³ : Preorder J
inst✝² : IsDirected J fun x x_1 => x ≤ x_1
F : Jᵒᵖ ⥤ Type v
inst✝¹ : ∀ (j : Jᵒᵖ), Finite (F.obj j)
inst✝ : ∀ (j : Jᵒᵖ), _root_.Nonempty (F.obj j)
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
cases isEmpty_or_nonempty J
[GOAL]
case inl
J : Type u
inst✝³ : Preorder J
inst✝² : IsDirected J fun x x_1 => x ≤ x_1
F : Jᵒᵖ ⥤ Type v
inst✝¹ : ∀ (j : Jᵒᵖ), Finite (F.obj j)
inst✝ : ∀ (j : Jᵒᵖ), _root_.Nonempty (F.obj j)
h✝ : IsEmpty J
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
haveI : IsEmpty Jᵒᵖ :=
  ⟨fun j => isEmptyElim j.unop⟩
    -- TODO: this should be a global instance
[GOAL]
case inl
J : Type u
inst✝³ : Preorder J
inst✝² : IsDirected J fun x x_1 => x ≤ x_1
F : Jᵒᵖ ⥤ Type v
inst✝¹ : ∀ (j : Jᵒᵖ), Finite (F.obj j)
inst✝ : ∀ (j : Jᵒᵖ), _root_.Nonempty (F.obj j)
h✝ : IsEmpty J
this : IsEmpty Jᵒᵖ
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
exact ⟨isEmptyElim, by apply isEmptyElim⟩
[GOAL]
J : Type u
inst✝³ : Preorder J
inst✝² : IsDirected J fun x x_1 => x ≤ x_1
F : Jᵒᵖ ⥤ Type v
inst✝¹ : ∀ (j : Jᵒᵖ), Finite (F.obj j)
inst✝ : ∀ (j : Jᵒᵖ), _root_.Nonempty (F.obj j)
h✝ : IsEmpty J
this : IsEmpty Jᵒᵖ
⊢ (fun a => isEmptyElim a) ∈ Functor.sections F
[PROOFSTEP]
apply isEmptyElim
[GOAL]
case inr
J : Type u
inst✝³ : Preorder J
inst✝² : IsDirected J fun x x_1 => x ≤ x_1
F : Jᵒᵖ ⥤ Type v
inst✝¹ : ∀ (j : Jᵒᵖ), Finite (F.obj j)
inst✝ : ∀ (j : Jᵒᵖ), _root_.Nonempty (F.obj j)
h✝ : _root_.Nonempty J
⊢ Set.Nonempty (Functor.sections F)
[PROOFSTEP]
exact nonempty_sections_of_finite_cofiltered_system _
[GOAL]
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
h : IsMittagLeffler F
f : j ⟶ i
⊢ eventualRange F i ⊆ F.map f '' eventualRange F j
[PROOFSTEP]
obtain ⟨k, g, hg⟩ := F.isMittagLeffler_iff_eventualRange.1 h j
[GOAL]
case intro.intro
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k✝ : J
s : Set (F.obj i)
h : IsMittagLeffler F
f : j ⟶ i
k : J
g : k ⟶ j
hg : eventualRange F j = range (F.map g)
⊢ eventualRange F i ⊆ F.map f '' eventualRange F j
[PROOFSTEP]
rw [hg]
[GOAL]
case intro.intro
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k✝ : J
s : Set (F.obj i)
h : IsMittagLeffler F
f : j ⟶ i
k : J
g : k ⟶ j
hg : eventualRange F j = range (F.map g)
⊢ eventualRange F i ⊆ F.map f '' range (F.map g)
[PROOFSTEP]
intro x hx
[GOAL]
case intro.intro
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k✝ : J
s : Set (F.obj i)
h : IsMittagLeffler F
f : j ⟶ i
k : J
g : k ⟶ j
hg : eventualRange F j = range (F.map g)
x : F.obj i
hx : x ∈ eventualRange F i
⊢ x ∈ F.map f '' range (F.map g)
[PROOFSTEP]
obtain ⟨x, rfl⟩ := F.mem_eventualRange_iff.1 hx (g ≫ f)
[GOAL]
case intro.intro.intro
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k✝ : J
s : Set (F.obj i)
h : IsMittagLeffler F
f : j ⟶ i
k : J
g : k ⟶ j
hg : eventualRange F j = range (F.map g)
x : F.obj k
hx : F.map (g ≫ f) x ∈ eventualRange F i
⊢ F.map (g ≫ f) x ∈ F.map f '' range (F.map g)
[PROOFSTEP]
refine' ⟨_, ⟨x, rfl⟩, by rw [map_comp_apply]⟩
[GOAL]
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k✝ : J
s : Set (F.obj i)
h : IsMittagLeffler F
f : j ⟶ i
k : J
g : k ⟶ j
hg : eventualRange F j = range (F.map g)
x : F.obj k
hx : F.map (g ≫ f) x ∈ eventualRange F i
⊢ F.map f (F.map g x) = F.map (g ≫ f) x
[PROOFSTEP]
rw [map_comp_apply]
[GOAL]
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
f : i ⟶ j
g : j ⟶ k
h : eventualRange F k = range (F.map g)
⊢ eventualRange F k = range (F.map (f ≫ g))
[PROOFSTEP]
apply subset_antisymm
[GOAL]
case a
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
f : i ⟶ j
g : j ⟶ k
h : eventualRange F k = range (F.map g)
⊢ eventualRange F k ⊆ range (F.map (f ≫ g))
[PROOFSTEP]
apply iInter₂_subset
[GOAL]
case a
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
f : i ⟶ j
g : j ⟶ k
h : eventualRange F k = range (F.map g)
⊢ range (F.map (f ≫ g)) ⊆ eventualRange F k
[PROOFSTEP]
rw [h, F.map_comp]
[GOAL]
case a
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
f : i ⟶ j
g : j ⟶ k
h : eventualRange F k = range (F.map g)
⊢ range (F.map f ≫ F.map g) ⊆ range (F.map g)
[PROOFSTEP]
apply range_comp_subset_range
[GOAL]
J : Type u
inst✝ : Category.{u_1, u} J
F : J ⥤ Type v
i j✝ k✝ : J
s : Set (F.obj i)
h : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
j k : J
g : k ⟶ j
⊢ range (F.map (𝟙 j)) ⊆ range (F.map g)
[PROOFSTEP]
rw [map_id, types_id, range_id, (h g).range_eq]
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ : J
g : X✝ ⟶ Y✝
x : F.obj X✝
h : x ∈ ⋂ (f : X✝ ⟶ i), F.map f ⁻¹' s
⊢ F.map g x ∈ ⋂ (f : Y✝ ⟶ i), F.map f ⁻¹' s
[PROOFSTEP]
rw [mem_iInter] at h ⊢
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ : J
g : X✝ ⟶ Y✝
x : F.obj X✝
h : ∀ (i_1 : X✝ ⟶ i), x ∈ F.map i_1 ⁻¹' s
⊢ ∀ (i_1 : Y✝ ⟶ i), F.map g x ∈ F.map i_1 ⁻¹' s
[PROOFSTEP]
intro f
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ : J
g : X✝ ⟶ Y✝
x : F.obj X✝
h : ∀ (i_1 : X✝ ⟶ i), x ∈ F.map i_1 ⁻¹' s
f : Y✝ ⟶ i
⊢ F.map g x ∈ F.map f ⁻¹' s
[PROOFSTEP]
rw [← mem_preimage, preimage_preimage, mem_preimage]
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ : J
g : X✝ ⟶ Y✝
x : F.obj X✝
h : ∀ (i_1 : X✝ ⟶ i), x ∈ F.map i_1 ⁻¹' s
f : Y✝ ⟶ i
⊢ F.map f (F.map g x) ∈ s
[PROOFSTEP]
convert h (g ≫ f)
[GOAL]
case a
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ : J
g : X✝ ⟶ Y✝
x : F.obj X✝
h : ∀ (i_1 : X✝ ⟶ i), x ∈ F.map i_1 ⁻¹' s
f : Y✝ ⟶ i
⊢ F.map f (F.map g x) ∈ s ↔ x ∈ F.map (g ≫ f) ⁻¹' s
[PROOFSTEP]
rw [F.map_comp]
[GOAL]
case a
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ : J
g : X✝ ⟶ Y✝
x : F.obj X✝
h : ∀ (i_1 : X✝ ⟶ i), x ∈ F.map i_1 ⁻¹' s
f : Y✝ ⟶ i
⊢ F.map f (F.map g x) ∈ s ↔ x ∈ (F.map g ≫ F.map f) ⁻¹' s
[PROOFSTEP]
rfl
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j✝ k : J
s : Set (F.obj i)
j : J
⊢ { obj := fun j => ↑(⋂ (f : j ⟶ i), F.map f ⁻¹' s),
          map := fun {X Y} g =>
            MapsTo.restrict (F.map g) (⋂ (f : X ⟶ i), F.map f ⁻¹' s) (⋂ (f : Y ⟶ i), F.map f ⁻¹' s)
              (_ : ∀ (x : F.obj X), x ∈ ⋂ (f : X ⟶ i), F.map f ⁻¹' s → F.map g x ∈ ⋂ (f : Y ⟶ i), F.map f ⁻¹' s) }.map
      (𝟙 j) =
    𝟙
      ({ obj := fun j => ↑(⋂ (f : j ⟶ i), F.map f ⁻¹' s),
            map := fun {X Y} g =>
              MapsTo.restrict (F.map g) (⋂ (f : X ⟶ i), F.map f ⁻¹' s) (⋂ (f : Y ⟶ i), F.map f ⁻¹' s)
                (_ : ∀ (x : F.obj X), x ∈ ⋂ (f : X ⟶ i), F.map f ⁻¹' s → F.map g x ∈ ⋂ (f : Y ⟶ i), F.map f ⁻¹' s) }.obj
        j)
[PROOFSTEP]
simp_rw [MapsTo.restrict, Subtype.map, F.map_id]
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j✝ k : J
s : Set (F.obj i)
j : J
⊢ (fun x => { val := 𝟙 (F.obj j) ↑x, property := (_ : (fun x => x ∈ ⋂ (f : j ⟶ i), F.map f ⁻¹' s) (𝟙 (F.obj j) ↑x)) }) =
    𝟙 ↑(⋂ (f : j ⟶ i), F.map f ⁻¹' s)
[PROOFSTEP]
ext
[GOAL]
case h.a
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j✝ k : J
s : Set (F.obj i)
j : J
a✝ : { x // x ∈ ⋂ (f : j ⟶ i), F.map f ⁻¹' s }
⊢ ↑{ val := 𝟙 (F.obj j) ↑a✝, property := (_ : (fun x => x ∈ ⋂ (f : j ⟶ i), F.map f ⁻¹' s) (𝟙 (F.obj j) ↑a✝)) } =
    ↑(𝟙 (↑(⋂ (f : j ⟶ i), F.map f ⁻¹' s)) a✝)
[PROOFSTEP]
rfl
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ Z✝ : J
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
⊢ { obj := fun j => ↑(⋂ (f : j ⟶ i), F.map f ⁻¹' s),
          map := fun {X Y} g =>
            MapsTo.restrict (F.map g) (⋂ (f : X ⟶ i), F.map f ⁻¹' s) (⋂ (f : Y ⟶ i), F.map f ⁻¹' s)
              (_ : ∀ (x : F.obj X), x ∈ ⋂ (f : X ⟶ i), F.map f ⁻¹' s → F.map g x ∈ ⋂ (f : Y ⟶ i), F.map f ⁻¹' s) }.map
      (f ≫ g) =
    { obj := fun j => ↑(⋂ (f : j ⟶ i), F.map f ⁻¹' s),
            map := fun {X Y} g =>
              MapsTo.restrict (F.map g) (⋂ (f : X ⟶ i), F.map f ⁻¹' s) (⋂ (f : Y ⟶ i), F.map f ⁻¹' s)
                (_ : ∀ (x : F.obj X), x ∈ ⋂ (f : X ⟶ i), F.map f ⁻¹' s → F.map g x ∈ ⋂ (f : Y ⟶ i), F.map f ⁻¹' s) }.map
        f ≫
      { obj := fun j => ↑(⋂ (f : j ⟶ i), F.map f ⁻¹' s),
            map := fun {X Y} g =>
              MapsTo.restrict (F.map g) (⋂ (f : X ⟶ i), F.map f ⁻¹' s) (⋂ (f : Y ⟶ i), F.map f ⁻¹' s)
                (_ : ∀ (x : F.obj X), x ∈ ⋂ (f : X ⟶ i), F.map f ⁻¹' s → F.map g x ∈ ⋂ (f : Y ⟶ i), F.map f ⁻¹' s) }.map
        g
[PROOFSTEP]
simp_rw [MapsTo.restrict, Subtype.map, F.map_comp]
[GOAL]
J : Type u
inst✝ : Category.{?u.11956, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
X✝ Y✝ Z✝ : J
f : X✝ ⟶ Y✝
g : Y✝ ⟶ Z✝
⊢ (fun x =>
      { val := (F.map f ≫ F.map g) ↑x,
        property := (_ : (fun x => x ∈ ⋂ (f : Z✝ ⟶ i), F.map f ⁻¹' s) ((F.map f ≫ F.map g) ↑x)) }) =
    (fun x => { val := F.map f ↑x, property := (_ : F.map f ↑x ∈ ⋂ (f : Y✝ ⟶ i), F.map f ⁻¹' s) }) ≫ fun x =>
      { val := F.map g ↑x, property := (_ : F.map g ↑x ∈ ⋂ (f : Z✝ ⟶ i), F.map f ⁻¹' s) }
[PROOFSTEP]
rfl
[GOAL]
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
f : j ⟶ i
x : F.obj j
hx : x ∈ eventualRange F j
⊢ F.map f x ∈ eventualRange F i
[PROOFSTEP]
rw [mem_eventualRange_iff] at hx ⊢
[GOAL]
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
f : j ⟶ i
x : F.obj j
hx : ∀ ⦃i : J⦄ (f : i ⟶ j), x ∈ range (F.map f)
⊢ ∀ ⦃i_1 : J⦄ (f_1 : i_1 ⟶ i), F.map f x ∈ range (F.map f_1)
[PROOFSTEP]
intro k f'
[GOAL]
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
f : j ⟶ i
x : F.obj j
hx : ∀ ⦃i : J⦄ (f : i ⟶ j), x ∈ range (F.map f)
k : J
f' : k ⟶ i
⊢ F.map f x ∈ range (F.map f')
[PROOFSTEP]
obtain ⟨l, g, g', he⟩ := cospan f f'
[GOAL]
case intro.intro.intro
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
f : j ⟶ i
x : F.obj j
hx : ∀ ⦃i : J⦄ (f : i ⟶ j), x ∈ range (F.map f)
k : J
f' : k ⟶ i
l : J
g : l ⟶ j
g' : l ⟶ k
he : g ≫ f = g' ≫ f'
⊢ F.map f x ∈ range (F.map f')
[PROOFSTEP]
obtain ⟨x, rfl⟩ := hx g
[GOAL]
case intro.intro.intro.intro
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
f : j ⟶ i
k : J
f' : k ⟶ i
l : J
g : l ⟶ j
g' : l ⟶ k
he : g ≫ f = g' ≫ f'
x : F.obj l
hx : ∀ ⦃i : J⦄ (f : i ⟶ j), F.map g x ∈ range (F.map f)
⊢ F.map f (F.map g x) ∈ range (F.map f')
[PROOFSTEP]
rw [← map_comp_apply, he, F.map_comp]
[GOAL]
case intro.intro.intro.intro
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
f : j ⟶ i
k : J
f' : k ⟶ i
l : J
g : l ⟶ j
g' : l ⟶ k
he : g ≫ f = g' ≫ f'
x : F.obj l
hx : ∀ ⦃i : J⦄ (f : i ⟶ j), F.map g x ∈ range (F.map f)
⊢ (F.map g' ≫ F.map f') x ∈ range (F.map f')
[PROOFSTEP]
exact ⟨_, rfl⟩
[GOAL]
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
f : i ⟶ j
⊢ eventualRange F j = range (F.map f) ↔ ∀ ⦃k : J⦄ (g : k ⟶ i), range (F.map f) ⊆ range (F.map (g ≫ f))
[PROOFSTEP]
rw [subset_antisymm_iff, eventualRange, and_iff_right (iInter₂_subset _ _), subset_iInter₂_iff]
[GOAL]
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
f : i ⟶ j
⊢ (∀ (i_1 : J) (j_1 : i_1 ⟶ j), range (F.map f) ⊆ range (F.map j_1)) ↔
    ∀ ⦃k : J⦄ (g : k ⟶ i), range (F.map f) ⊆ range (F.map (g ≫ f))
[PROOFSTEP]
refine' ⟨fun h k g => h _ _, fun h j' f' => _⟩
[GOAL]
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
f : i ⟶ j
h : ∀ ⦃k : J⦄ (g : k ⟶ i), range (F.map f) ⊆ range (F.map (g ≫ f))
j' : J
f' : j' ⟶ j
⊢ range (F.map f) ⊆ range (F.map f')
[PROOFSTEP]
obtain ⟨k, g, g', he⟩ := cospan f f'
[GOAL]
case intro.intro.intro
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
f : i ⟶ j
h : ∀ ⦃k : J⦄ (g : k ⟶ i), range (F.map f) ⊆ range (F.map (g ≫ f))
j' : J
f' : j' ⟶ j
k : J
g : k ⟶ i
g' : k ⟶ j'
he : g ≫ f = g' ≫ f'
⊢ range (F.map f) ⊆ range (F.map f')
[PROOFSTEP]
refine' (h g).trans _
[GOAL]
case intro.intro.intro
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
f : i ⟶ j
h : ∀ ⦃k : J⦄ (g : k ⟶ i), range (F.map f) ⊆ range (F.map (g ≫ f))
j' : J
f' : j' ⟶ j
k : J
g : k ⟶ i
g' : k ⟶ j'
he : g ≫ f = g' ≫ f'
⊢ range (F.map (g ≫ f)) ⊆ range (F.map f')
[PROOFSTEP]
rw [he, F.map_comp]
[GOAL]
case intro.intro.intro
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
f : i ⟶ j
h : ∀ ⦃k : J⦄ (g : k ⟶ i), range (F.map f) ⊆ range (F.map (g ≫ f))
j' : J
f' : j' ⟶ j
k : J
g : k ⟶ i
g' : k ⟶ j'
he : g ≫ f = g' ≫ f'
⊢ range (F.map g' ≫ F.map f') ⊆ range (F.map f')
[PROOFSTEP]
apply range_comp_subset_range
[GOAL]
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
⊢ IsMittagLeffler F ↔ ∀ (j : J), ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ i), range (F.map f) ⊆ range (F.map (g ≫ f))
[PROOFSTEP]
simp_rw [isMittagLeffler_iff_eventualRange, eventualRange_eq_iff]
[GOAL]
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
h : IsMittagLeffler F
j : J
⊢ ∃ i_1 f,
    ∀ ⦃k : J⦄ (g : k ⟶ i_1), range ((Functor.toPreimages F s).map f) ⊆ range ((Functor.toPreimages F s).map (g ≫ f))
[PROOFSTEP]
obtain ⟨j₁, g₁, f₁, -⟩ := IsCofilteredOrEmpty.cone_objs i j
[GOAL]
case intro.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
⊢ ∃ i_1 f,
    ∀ ⦃k : J⦄ (g : k ⟶ i_1), range ((Functor.toPreimages F s).map f) ⊆ range ((Functor.toPreimages F s).map (g ≫ f))
[PROOFSTEP]
obtain ⟨j₂, f₂, h₂⟩ := F.isMittagLeffler_iff_eventualRange.1 h j₁
[GOAL]
case intro.intro.intro.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
⊢ ∃ i_1 f,
    ∀ ⦃k : J⦄ (g : k ⟶ i_1), range ((Functor.toPreimages F s).map f) ⊆ range ((Functor.toPreimages F s).map (g ≫ f))
[PROOFSTEP]
refine' ⟨j₂, f₂ ≫ f₁, fun j₃ f₃ => _⟩
[GOAL]
case intro.intro.intro.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
⊢ range ((Functor.toPreimages F s).map (f₂ ≫ f₁)) ⊆ range ((Functor.toPreimages F s).map (f₃ ≫ f₂ ≫ f₁))
[PROOFSTEP]
rintro _ ⟨⟨x, hx⟩, rfl⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.mk
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
⊢ (Functor.toPreimages F s).map (f₂ ≫ f₁) { val := x, property := hx } ∈
    range ((Functor.toPreimages F s).map (f₃ ≫ f₂ ≫ f₁))
[PROOFSTEP]
have : F.map f₂ x ∈ F.eventualRange j₁ := by
  rw [h₂]
  exact ⟨_, rfl⟩
[GOAL]
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
⊢ F.map f₂ x ∈ eventualRange F j₁
[PROOFSTEP]
rw [h₂]
[GOAL]
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
⊢ F.map f₂ x ∈ range (F.map f₂)
[PROOFSTEP]
exact ⟨_, rfl⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.mk
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
⊢ (Functor.toPreimages F s).map (f₂ ≫ f₁) { val := x, property := hx } ∈
    range ((Functor.toPreimages F s).map (f₃ ≫ f₂ ≫ f₁))
[PROOFSTEP]
obtain ⟨y, hy, h₃⟩ := h.subset_image_eventualRange F (f₃ ≫ f₂) this
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
y : F.obj j₃
hy : y ∈ eventualRange F j₃
h₃ : F.map (f₃ ≫ f₂) y = F.map f₂ x
⊢ (Functor.toPreimages F s).map (f₂ ≫ f₁) { val := x, property := hx } ∈
    range ((Functor.toPreimages F s).map (f₃ ≫ f₂ ≫ f₁))
[PROOFSTEP]
refine' ⟨⟨y, mem_iInter.2 fun g₂ => _⟩, Subtype.ext _⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro.refine'_1
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
y : F.obj j₃
hy : y ∈ eventualRange F j₃
h₃ : F.map (f₃ ≫ f₂) y = F.map f₂ x
g₂ : j₃ ⟶ i
⊢ y ∈ F.map g₂ ⁻¹' s
[PROOFSTEP]
obtain ⟨j₄, f₄, h₄⟩ := IsCofilteredOrEmpty.cone_maps g₂ ((f₃ ≫ f₂) ≫ g₁)
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro.refine'_1.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
y : F.obj j₃
hy : y ∈ eventualRange F j₃
h₃ : F.map (f₃ ≫ f₂) y = F.map f₂ x
g₂ : j₃ ⟶ i
j₄ : J
f₄ : j₄ ⟶ j₃
h₄ : f₄ ≫ g₂ = f₄ ≫ (f₃ ≫ f₂) ≫ g₁
⊢ y ∈ F.map g₂ ⁻¹' s
[PROOFSTEP]
obtain ⟨y, rfl⟩ := F.mem_eventualRange_iff.1 hy f₄
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro.refine'_1.intro.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
g₂ : j₃ ⟶ i
j₄ : J
f₄ : j₄ ⟶ j₃
h₄ : f₄ ≫ g₂ = f₄ ≫ (f₃ ≫ f₂) ≫ g₁
y : F.obj j₄
hy : F.map f₄ y ∈ eventualRange F j₃
h₃ : F.map (f₃ ≫ f₂) (F.map f₄ y) = F.map f₂ x
⊢ F.map f₄ y ∈ F.map g₂ ⁻¹' s
[PROOFSTEP]
rw [← map_comp_apply] at h₃
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro.refine'_1.intro.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
g₂ : j₃ ⟶ i
j₄ : J
f₄ : j₄ ⟶ j₃
h₄ : f₄ ≫ g₂ = f₄ ≫ (f₃ ≫ f₂) ≫ g₁
y : F.obj j₄
hy : F.map f₄ y ∈ eventualRange F j₃
h₃ : F.map (f₄ ≫ f₃ ≫ f₂) y = F.map f₂ x
⊢ F.map f₄ y ∈ F.map g₂ ⁻¹' s
[PROOFSTEP]
rw [mem_preimage, ← map_comp_apply, h₄, ← Category.assoc, map_comp_apply, h₃, ← map_comp_apply]
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro.refine'_1.intro.intro.intro
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
g₂ : j₃ ⟶ i
j₄ : J
f₄ : j₄ ⟶ j₃
h₄ : f₄ ≫ g₂ = f₄ ≫ (f₃ ≫ f₂) ≫ g₁
y : F.obj j₄
hy : F.map f₄ y ∈ eventualRange F j₃
h₃ : F.map (f₄ ≫ f₃ ≫ f₂) y = F.map f₂ x
⊢ F.map (f₂ ≫ g₁) x ∈ s
[PROOFSTEP]
apply mem_iInter.1 hx
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro.refine'_2
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
y : F.obj j₃
hy : y ∈ eventualRange F j₃
h₃ : F.map (f₃ ≫ f₂) y = F.map f₂ x
⊢ ↑((Functor.toPreimages F s).map (f₃ ≫ f₂ ≫ f₁)
        { val := y, property := (_ : y ∈ ⋂ (i_1 : j₃ ⟶ i), F.map i_1 ⁻¹' s) }) =
    ↑((Functor.toPreimages F s).map (f₂ ≫ f₁) { val := x, property := hx })
[PROOFSTEP]
simp_rw [toPreimages_map, MapsTo.val_restrict_apply]
[GOAL]
case intro.intro.intro.intro.intro.intro.mk.intro.intro.refine'_2
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
h : IsMittagLeffler F
j j₁ : J
g₁ : j₁ ⟶ i
f₁ : j₁ ⟶ j
j₂ : J
f₂ : j₂ ⟶ j₁
h₂ : eventualRange F j₁ = range (F.map f₂)
j₃ : J
f₃ : j₃ ⟶ j₂
x : F.obj j₂
hx : x ∈ ⋂ (f : j₂ ⟶ i), F.map f ⁻¹' s
this : F.map f₂ x ∈ eventualRange F j₁
y : F.obj j₃
hy : y ∈ eventualRange F j₃
h₃ : F.map (f₃ ≫ f₂) y = F.map f₂ x
⊢ F.map (f₃ ≫ f₂ ≫ f₁) y = F.map (f₂ ≫ f₁) x
[PROOFSTEP]
rw [← Category.assoc, map_comp_apply, h₃, map_comp_apply]
[GOAL]
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
⊢ IsMittagLeffler F
[PROOFSTEP]
intro j
[GOAL]
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
j : J
⊢ ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ j), range (F.map f) ⊆ range (F.map g)
[PROOFSTEP]
obtain ⟨i, hi, hf⟩ := h j
[GOAL]
case intro.intro
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
j i : J
hi : i ⟶ j
hf : Set.Finite (range (F.map hi))
⊢ ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ j), range (F.map f) ⊆ range (F.map g)
[PROOFSTEP]
obtain ⟨m, ⟨i, f, hm⟩, hmin⟩ :=
  Finset.wellFoundedLT.wf.has_min {s : Finset (F.obj j) | ∃ (i : _) (f : i ⟶ j), ↑s = range (F.map f)}
    ⟨_, i, hi, hf.coe_toFinset⟩
[GOAL]
case intro.intro.intro.intro.intro.intro
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
j i✝ : J
hi : i✝ ⟶ j
hf : Set.Finite (range (F.map hi))
m : Finset (F.obj j)
hmin : ∀ (x : Finset (F.obj j)), x ∈ {s | ∃ i f, ↑s = range (F.map f)} → ¬x < m
i : J
f : i ⟶ j
hm : ↑m = range (F.map f)
⊢ ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ j), range (F.map f) ⊆ range (F.map g)
[PROOFSTEP]
refine' ⟨i, f, fun k g => (directedOn_range.mp <| F.ranges_directed j).is_bot_of_is_min ⟨⟨i, f⟩, rfl⟩ _ _ ⟨⟨k, g⟩, rfl⟩⟩
[GOAL]
case intro.intro.intro.intro.intro.intro
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
j i✝ : J
hi : i✝ ⟶ j
hf : Set.Finite (range (F.map hi))
m : Finset (F.obj j)
hmin : ∀ (x : Finset (F.obj j)), x ∈ {s | ∃ i f, ↑s = range (F.map f)} → ¬x < m
i : J
f : i ⟶ j
hm : ↑m = range (F.map f)
k : J
g : k ⟶ j
⊢ ∀ (a : Set (F.obj j)),
    (a ∈ range fun f => range (F.map f.snd)) →
      a ≤ (fun f => range (F.map f.snd)) { fst := i, snd := f } →
        (fun f => range (F.map f.snd)) { fst := i, snd := f } ≤ a
[PROOFSTEP]
rintro _ ⟨⟨k', g'⟩, rfl⟩ hl
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.mk
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
j i✝ : J
hi : i✝ ⟶ j
hf : Set.Finite (range (F.map hi))
m : Finset (F.obj j)
hmin : ∀ (x : Finset (F.obj j)), x ∈ {s | ∃ i f, ↑s = range (F.map f)} → ¬x < m
i : J
f : i ⟶ j
hm : ↑m = range (F.map f)
k : J
g : k ⟶ j
k' : J
g' : k' ⟶ j
hl : (fun f => range (F.map f.snd)) { fst := k', snd := g' } ≤ (fun f => range (F.map f.snd)) { fst := i, snd := f }
⊢ (fun f => range (F.map f.snd)) { fst := i, snd := f } ≤ (fun f => range (F.map f.snd)) { fst := k', snd := g' }
[PROOFSTEP]
refine' (eq_of_le_of_not_lt hl _).ge
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.mk
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
j i✝ : J
hi : i✝ ⟶ j
hf : Set.Finite (range (F.map hi))
m : Finset (F.obj j)
hmin : ∀ (x : Finset (F.obj j)), x ∈ {s | ∃ i f, ↑s = range (F.map f)} → ¬x < m
i : J
f : i ⟶ j
hm : ↑m = range (F.map f)
k : J
g : k ⟶ j
k' : J
g' : k' ⟶ j
hl : (fun f => range (F.map f.snd)) { fst := k', snd := g' } ≤ (fun f => range (F.map f.snd)) { fst := i, snd := f }
⊢ ¬(fun f => range (F.map f.snd)) { fst := k', snd := g' } < (fun f => range (F.map f.snd)) { fst := i, snd := f }
[PROOFSTEP]
have := hmin _ ⟨k', g', (m.finite_toSet.subset <| hm.substr hl).coe_toFinset⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.mk
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
h : ∀ (j : J), ∃ i f, Set.Finite (range (F.map f))
j i✝ : J
hi : i✝ ⟶ j
hf : Set.Finite (range (F.map hi))
m : Finset (F.obj j)
hmin : ∀ (x : Finset (F.obj j)), x ∈ {s | ∃ i f, ↑s = range (F.map f)} → ¬x < m
i : J
f : i ⟶ j
hm : ↑m = range (F.map f)
k : J
g : k ⟶ j
k' : J
g' : k' ⟶ j
hl : (fun f => range (F.map f.snd)) { fst := k', snd := g' } ≤ (fun f => range (F.map f.snd)) { fst := i, snd := f }
this : ¬Finite.toFinset (_ : Set.Finite (range (F.map g'))) < m
⊢ ¬(fun f => range (F.map f.snd)) { fst := k', snd := g' } < (fun f => range (F.map f.snd)) { fst := i, snd := f }
[PROOFSTEP]
rwa [Finset.lt_iff_ssubset, ← Finset.coe_ssubset, Set.Finite.coe_toFinset, hm] at this
[GOAL]
J : Type u
inst✝¹ : Category.{?u.27549, u} J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝ : IsCofilteredOrEmpty J
i : J
⊢ { obj := fun j => ↑(eventualRange F j),
          map := fun {X Y} f =>
            MapsTo.restrict (F.map f) (eventualRange F X) (eventualRange F Y)
              (_ : MapsTo (F.map f) (eventualRange F X) (eventualRange F Y)) }.map
      (𝟙 i) =
    𝟙
      ({ obj := fun j => ↑(eventualRange F j),
            map := fun {X Y} f =>
              MapsTo.restrict (F.map f) (eventualRange F X) (eventualRange F Y)
                (_ : MapsTo (F.map f) (eventualRange F X) (eventualRange F Y)) }.obj
        i)
[PROOFSTEP]
simp_rw [MapsTo.restrict, Subtype.map, F.map_id]
[GOAL]
J : Type u
inst✝¹ : Category.{?u.27549, u} J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝ : IsCofilteredOrEmpty J
i : J
⊢ (fun x => { val := 𝟙 (F.obj i) ↑x, property := (_ : (fun x => x ∈ eventualRange F i) (𝟙 (F.obj i) ↑x)) }) =
    𝟙 ↑(eventualRange F i)
[PROOFSTEP]
ext
[GOAL]
case h.a
J : Type u
inst✝¹ : Category.{?u.27549, u} J
F : J ⥤ Type v
i✝ j k : J
s : Set (F.obj i✝)
inst✝ : IsCofilteredOrEmpty J
i : J
a✝ : { x // x ∈ eventualRange F i }
⊢ ↑{ val := 𝟙 (F.obj i) ↑a✝, property := (_ : (fun x => x ∈ eventualRange F i) (𝟙 (F.obj i) ↑a✝)) } =
    ↑(𝟙 (↑(eventualRange F i)) a✝)
[PROOFSTEP]
rfl
[GOAL]
J : Type u
inst✝¹ : Category.{?u.27549, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝ : IsCofilteredOrEmpty J
X✝ Y✝ Z✝ : J
x✝¹ : X✝ ⟶ Y✝
x✝ : Y✝ ⟶ Z✝
⊢ { obj := fun j => ↑(eventualRange F j),
          map := fun {X Y} f =>
            MapsTo.restrict (F.map f) (eventualRange F X) (eventualRange F Y)
              (_ : MapsTo (F.map f) (eventualRange F X) (eventualRange F Y)) }.map
      (x✝¹ ≫ x✝) =
    { obj := fun j => ↑(eventualRange F j),
            map := fun {X Y} f =>
              MapsTo.restrict (F.map f) (eventualRange F X) (eventualRange F Y)
                (_ : MapsTo (F.map f) (eventualRange F X) (eventualRange F Y)) }.map
        x✝¹ ≫
      { obj := fun j => ↑(eventualRange F j),
            map := fun {X Y} f =>
              MapsTo.restrict (F.map f) (eventualRange F X) (eventualRange F Y)
                (_ : MapsTo (F.map f) (eventualRange F X) (eventualRange F Y)) }.map
        x✝
[PROOFSTEP]
simp_rw [MapsTo.restrict, Subtype.map, F.map_comp]
[GOAL]
J : Type u
inst✝¹ : Category.{?u.27549, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝ : IsCofilteredOrEmpty J
X✝ Y✝ Z✝ : J
x✝¹ : X✝ ⟶ Y✝
x✝ : Y✝ ⟶ Z✝
⊢ (fun x =>
      { val := (F.map x✝¹ ≫ F.map x✝) ↑x,
        property := (_ : (fun x => x ∈ eventualRange F Z✝) ((F.map x✝¹ ≫ F.map x✝) ↑x)) }) =
    (fun x => { val := F.map x✝¹ ↑x, property := (_ : F.map x✝¹ ↑x ∈ eventualRange F Y✝) }) ≫ fun x =>
      { val := F.map x✝ ↑x, property := (_ : F.map x✝ ↑x ∈ eventualRange F Z✝) }
[PROOFSTEP]
rfl
[GOAL]
J : Type u
inst✝¹ : Category.{?u.30110, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝ : IsCofilteredOrEmpty J
x✝ : ↑(sections (toEventualRanges F))
⊢ (fun s =>
        { val := fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) },
          property :=
            (_ :
              ∀ {j j' : J} (f : j ⟶ j'),
                (toEventualRanges F).map f
                    ((fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) })
                      j) =
                  (fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) }) j') })
      ((fun s =>
          { val := fun {j} => ↑(↑s j),
            property := (_ : ∀ {j j' : J} (f : j ⟶ j'), ↑((toEventualRanges F).map f (↑s j)) = ↑(↑s j')) })
        x✝) =
    x✝
[PROOFSTEP]
ext
[GOAL]
case a.h
J : Type u
inst✝¹ : Category.{?u.30110, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝ : IsCofilteredOrEmpty J
x✝¹ : ↑(sections (toEventualRanges F))
x✝ : J
⊢ ↑((fun s =>
            { val := fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) },
              property :=
                (_ :
                  ∀ {j j' : J} (f : j ⟶ j'),
                    (toEventualRanges F).map f
                        ((fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) })
                          j) =
                      (fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) })
                        j') })
          ((fun s =>
              { val := fun {j} => ↑(↑s j),
                property := (_ : ∀ {j j' : J} (f : j ⟶ j'), ↑((toEventualRanges F).map f (↑s j)) = ↑(↑s j')) })
            x✝¹))
      x✝ =
    ↑x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
J : Type u
inst✝¹ : Category.{?u.30110, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝ : IsCofilteredOrEmpty J
x✝ : ↑(sections F)
⊢ (fun s =>
        { val := fun {j} => ↑(↑s j),
          property := (_ : ∀ {j j' : J} (f : j ⟶ j'), ↑((toEventualRanges F).map f (↑s j)) = ↑(↑s j')) })
      ((fun s =>
          { val := fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) },
            property :=
              (_ :
                ∀ {j j' : J} (f : j ⟶ j'),
                  (toEventualRanges F).map f
                      ((fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) })
                        j) =
                    (fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) })
                      j') })
        x✝) =
    x✝
[PROOFSTEP]
ext
[GOAL]
case a.h
J : Type u
inst✝¹ : Category.{?u.30110, u} J
F : J ⥤ Type v
i j k : J
s : Set (F.obj i)
inst✝ : IsCofilteredOrEmpty J
x✝¹ : ↑(sections F)
x✝ : J
⊢ ↑((fun s =>
            { val := fun {j} => ↑(↑s j),
              property := (_ : ∀ {j j' : J} (f : j ⟶ j'), ↑((toEventualRanges F).map f (↑s j)) = ↑(↑s j')) })
          ((fun s =>
              { val := fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) },
                property :=
                  (_ :
                    ∀ {j j' : J} (f : j ⟶ j'),
                      (toEventualRanges F).map f
                          ((fun j =>
                              { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) })
                            j) =
                        (fun j => { val := ↑s j, property := (_ : ↑s j ∈ ⋂ (i : J) (j_1 : i ⟶ j), range (F.map j_1)) })
                          j') })
            x✝¹))
      x✝ =
    ↑x✝¹ x✝
[PROOFSTEP]
rfl
[GOAL]
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
h : IsMittagLeffler F
i j : J
f : i ⟶ j
x✝ : (toEventualRanges F).obj j
x : F.obj j
hx : x ∈ eventualRange F j
⊢ ∃ a, (toEventualRanges F).map f a = { val := x, property := hx }
[PROOFSTEP]
obtain ⟨y, hy, rfl⟩ := h.subset_image_eventualRange F f hx
[GOAL]
case intro.intro
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
h : IsMittagLeffler F
i j : J
f : i ⟶ j
x✝ : (toEventualRanges F).obj j
y : F.obj i
hy : y ∈ eventualRange F i
hx : F.map f y ∈ eventualRange F j
⊢ ∃ a, (toEventualRanges F).map f a = { val := F.map f y, property := hx }
[PROOFSTEP]
exact ⟨⟨y, hy⟩, rfl⟩
[GOAL]
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
h : IsMittagLeffler F
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
j : J
⊢ _root_.Nonempty ((toEventualRanges F).obj j)
[PROOFSTEP]
let ⟨i, f, h⟩ := F.isMittagLeffler_iff_eventualRange.1 h j
[GOAL]
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
h✝ : IsMittagLeffler F
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
j i : J
f : i ⟶ j
h : eventualRange F j = range (F.map f)
⊢ _root_.Nonempty ((toEventualRanges F).obj j)
[PROOFSTEP]
rw [toEventualRanges_obj, h]
[GOAL]
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
h✝ : IsMittagLeffler F
inst✝ : ∀ (j : J), _root_.Nonempty (F.obj j)
j i : J
f : i ⟶ j
h : eventualRange F j = range (F.map f)
⊢ _root_.Nonempty ↑(range (F.map f))
[PROOFSTEP]
infer_instance
[GOAL]
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
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i j : J
f g : i ⟶ j
k : J
φ : k ⟶ i
hφ : φ ≫ f = φ ≫ g
⊢ (fun g => g ∘ F.map φ) (F.map f) = (fun g => g ∘ F.map φ) (F.map g)
[PROOFSTEP]
simp_rw [← types_comp, ← F.map_comp, hφ]
[GOAL]
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
hFn : ∀ (j : J), _root_.Nonempty (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
hs : Set.Nonempty s
j : J
⊢ _root_.Nonempty ((toPreimages F s).obj j)
[PROOFSTEP]
simp only [toPreimages_obj, nonempty_coe_sort, nonempty_iInter, mem_preimage]
[GOAL]
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
hFn : ∀ (j : J), _root_.Nonempty (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
hs : Set.Nonempty s
j : J
⊢ ∃ x, ∀ (i_1 : j ⟶ i), F.map i_1 x ∈ s
[PROOFSTEP]
obtain h | ⟨⟨ji⟩⟩ := isEmpty_or_nonempty (j ⟶ i)
[GOAL]
case inl
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
hFn : ∀ (j : J), _root_.Nonempty (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
hs : Set.Nonempty s
j : J
h : IsEmpty (j ⟶ i)
⊢ ∃ x, ∀ (i_1 : j ⟶ i), F.map i_1 x ∈ s
[PROOFSTEP]
exact ⟨(hFn j).some, fun ji => h.elim ji⟩
[GOAL]
case inr.intro
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
hFn : ∀ (j : J), _root_.Nonempty (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
hs : Set.Nonempty s
j : J
ji : j ⟶ i
⊢ ∃ x, ∀ (i_1 : j ⟶ i), F.map i_1 x ∈ s
[PROOFSTEP]
obtain ⟨y, ys⟩ := hs
[GOAL]
case inr.intro.intro
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
hFn : ∀ (j : J), _root_.Nonempty (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
j : J
ji : j ⟶ i
y : F.obj i
ys : y ∈ s
⊢ ∃ x, ∀ (i_1 : j ⟶ i), F.map i_1 x ∈ s
[PROOFSTEP]
obtain ⟨x, rfl⟩ := Fsur ji y
[GOAL]
case inr.intro.intro.intro
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
hFn : ∀ (j : J), _root_.Nonempty (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
j : J
ji : j ⟶ i
x : F.obj j
ys : F.map ji x ∈ s
⊢ ∃ x, ∀ (i_1 : j ⟶ i), F.map i_1 x ∈ s
[PROOFSTEP]
exact ⟨x, fun ji' => (F.thin_diagram_of_surjective Fsur ji' ji).symm ▸ ys⟩
[GOAL]
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
j : J
Finj : ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
i : J
f : i ⟶ j
⊢ Function.Injective fun s => ↑s j
[PROOFSTEP]
refine' fun s₀ s₁ h => Subtype.ext <| funext fun k => _
[GOAL]
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
j : J
Finj : ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
i : J
f : i ⟶ j
s₀ s₁ : ↑(sections F)
h : (fun s => ↑s j) s₀ = (fun s => ↑s j) s₁
k : J
⊢ ↑s₀ k = ↑s₁ k
[PROOFSTEP]
obtain ⟨m, mi, mk, _⟩ := IsCofilteredOrEmpty.cone_objs i k
[GOAL]
case intro.intro.intro
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
j : J
Finj : ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
i : J
f : i ⟶ j
s₀ s₁ : ↑(sections F)
h : (fun s => ↑s j) s₀ = (fun s => ↑s j) s₁
k m : J
mi : m ⟶ i
mk : m ⟶ k
h✝ : True
⊢ ↑s₀ k = ↑s₁ k
[PROOFSTEP]
dsimp at h
[GOAL]
case intro.intro.intro
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
j : J
Finj : ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
i : J
f : i ⟶ j
s₀ s₁ : ↑(sections F)
h : ↑s₀ j = ↑s₁ j
k m : J
mi : m ⟶ i
mk : m ⟶ k
h✝ : True
⊢ ↑s₀ k = ↑s₁ k
[PROOFSTEP]
rw [← s₀.prop (mi ≫ f), ← s₁.prop (mi ≫ f)] at h
[GOAL]
case intro.intro.intro
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
j : J
Finj : ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
i : J
f : i ⟶ j
s₀ s₁ : ↑(sections F)
k m : J
mi : m ⟶ i
h : F.map (mi ≫ f) (↑s₀ m) = F.map (mi ≫ f) (↑s₁ m)
mk : m ⟶ k
h✝ : True
⊢ ↑s₀ k = ↑s₁ k
[PROOFSTEP]
rw [← s₀.prop mk, ← s₁.prop mk]
[GOAL]
case intro.intro.intro
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
j : J
Finj : ∀ (i : J) (f : i ⟶ j), Function.Injective (F.map f)
i : J
f : i ⟶ j
s₀ s₁ : ↑(sections F)
k m : J
mi : m ⟶ i
h : F.map (mi ≫ f) (↑s₀ m) = F.map (mi ≫ f) (↑s₁ m)
mk : m ⟶ k
h✝ : True
⊢ F.map mk (↑s₀ m) = F.map mk (↑s₁ m)
[PROOFSTEP]
refine' congr_arg _ (Finj m (mi ≫ f) h)
[GOAL]
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
⊢ ∃ a, (fun s => ↑s i) a = x
[PROOFSTEP]
let s : Set (F.obj i) := { x }
[GOAL]
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
⊢ ∃ a, (fun s => ↑s i) a = x
[PROOFSTEP]
haveI := F.toPreimages_nonempty_of_surjective s Fsur (singleton_nonempty x)
[GOAL]
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), _root_.Nonempty ((toPreimages F s).obj j)
⊢ ∃ a, (fun s => ↑s i) a = x
[PROOFSTEP]
obtain ⟨sec, h⟩ := nonempty_sections_of_finite_cofiltered_system (F.toPreimages s)
[GOAL]
case intro
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
⊢ ∃ a, (fun s => ↑s i) a = x
[PROOFSTEP]
refine' ⟨⟨fun j => (sec j).val, fun jk => by simpa [Subtype.ext_iff] using h jk⟩, _⟩
[GOAL]
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
j✝ j'✝ : J
jk : j✝ ⟶ j'✝
⊢ F.map jk ((fun j => ↑(sec j)) j✝) = (fun j => ↑(sec j)) j'✝
[PROOFSTEP]
simpa [Subtype.ext_iff] using h jk
[GOAL]
case intro
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this : ∀ (j : J), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x
[PROOFSTEP]
have := (sec i).prop
[GOAL]
case intro
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this✝ : ∀ (j : J), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
this : ↑(sec i) ∈ ⋂ (f : i ⟶ i), F.map f ⁻¹' s
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x
[PROOFSTEP]
simp only [mem_iInter, mem_preimage, mem_singleton_iff] at this
[GOAL]
case intro
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this✝ : ∀ (j : J), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
this : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) = x
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x
[PROOFSTEP]
have := this (𝟙 i)
[GOAL]
case intro
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), _root_.Nonempty (F.obj j)
inst✝ : ∀ (j : J), Finite (F.obj j)
Fsur : ∀ ⦃i j : J⦄ (f : i ⟶ j), Function.Surjective (F.map f)
i : J
x : F.obj i
s : Set (F.obj i) := {x}
this✝¹ : ∀ (j : J), _root_.Nonempty ((toPreimages F s).obj j)
sec : (j : J) → (toPreimages F s).obj j
h : sec ∈ sections (toPreimages F s)
this✝ : ∀ (i_1 : i ⟶ i), F.map i_1 ↑(sec i) = x
this : F.map (𝟙 i) ↑(sec i) = x
⊢ (fun s => ↑s i)
      { val := fun j => ↑(sec j),
        property := (_ : ∀ {j j' : J} (jk : j ⟶ j'), F.map jk ((fun j => ↑(sec j)) j) = (fun j => ↑(sec j)) j') } =
    x
[PROOFSTEP]
rwa [map_id_apply] at this
[GOAL]
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), _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)
[PROOFSTEP]
haveI : ∀ j, Fintype (F.obj j) := fun j => Fintype.ofFinite (F.obj j)
[GOAL]
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), _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)
[PROOFSTEP]
haveI : Fintype F.sections := Fintype.ofFinite F.sections
[GOAL]
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), _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)
[PROOFSTEP]
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)
[GOAL]
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), _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)
[PROOFSTEP]
let fn j := Fintype.card F.sections - Fintype.card (F.obj j)
[GOAL]
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), _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)
[PROOFSTEP]
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⟩
[GOAL]
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), _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)))
[PROOFSTEP]
rw [← Nat.sub_sub_self (card_le i), tsub_le_iff_tsub_le]
[GOAL]
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), _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)
[PROOFSTEP]
apply fn.argmin_le