-- Mathlib/CategoryTheory/CofilteredSystem.lean
theorem isMittagLeffler_of_exists_finite_range
    (h : ∀ j : J, ∃ (i : _) (f : i ⟶ j), (range <| F.map f).Finite) : F.IsMittagLeffler

Proof state:
case intro.intro.intro.intro.intro.intro.intro.mk
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)) ⟨k', g'⟩ ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩
⊢ ¬(fun f => range (F.map f.snd)) ⟨k', g'⟩ < (fun f => range (F.map f.snd)) ⟨i, f⟩

Tactic:
have := hmin _ ⟨k', g', (m.finite_toSet.subset <| hm.substr hl).coe_toFinset⟩

Result:
case intro.intro.intro.intro.intro.intro.intro.mk
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)) ⟨k', g'⟩ ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩
this : ¬⋯.toFinset < m
⊢ ¬(fun f => range (F.map f.snd)) ⟨k', g'⟩ < (fun f => range (F.map f.snd)) ⟨i, f⟩

Proof state:
case intro.intro.intro.intro.intro.intro.intro.mk
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)) ⟨k', g'⟩ ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩
⊢ (fun f => range (F.map f.snd)) ⟨i, f⟩ ≤ (fun f => range (F.map f.snd)) ⟨k', g'⟩

Tactic:
refine (eq_of_le_of_not_lt hl ?_).ge

Result:
case intro.intro.intro.intro.intro.intro.intro.mk
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)) ⟨k', g'⟩ ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩
⊢ ¬(fun f => range (F.map f.snd)) ⟨k', g'⟩ < (fun f => range (F.map f.snd)) ⟨i, f⟩

Proof state:
case intro.intro.intro.intro.intro.intro.intro.mk
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)) ⟨k', g'⟩ ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩
this : ¬⋯.toFinset < m
⊢ ¬(fun f => range (F.map f.snd)) ⟨k', g'⟩ < (fun f => range (F.map f.snd)) ⟨i, f⟩

Tactic:
rwa [Finset.lt_iff_ssubset, ← Finset.coe_ssubset, Set.Finite.coe_toFinset, hm] at this

Result:
no goals

Proof state:
case intro.intro.intro.intro.intro.intro
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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 ∈ range fun f => range (F.map f.snd),
    a ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩ → (fun f => range (F.map f.snd)) ⟨i, f⟩ ≤ a

Tactic:
rintro _ ⟨⟨k', g'⟩, rfl⟩ hl

Result:
case intro.intro.intro.intro.intro.intro.intro.mk
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)) ⟨k', g'⟩ ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩
⊢ (fun f => range (F.map f.snd)) ⟨i, f⟩ ≤ (fun f => range (F.map f.snd)) ⟨k', g'⟩

Proof state:
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
⊢ F.IsMittagLeffler

Tactic:
intro j

Result:
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j : J
⊢ ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ j), range (F.map f) ⊆ range (F.map g)

Proof state:
case intro.intro
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i : J
hi : i ⟶ j
hf : (range (F.map hi)).Finite
⊢ ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ j), range (F.map f) ⊆ range (F.map g)

Tactic:
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⟩

Result:
case intro.intro.intro.intro.intro.intro
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)

Proof state:
case intro.intro.intro.intro.intro.intro
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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)

Tactic:
refine ⟨i, f, fun k g =>
  (directedOn_range.mp <| F.ranges_directed j).is_bot_of_is_min ⟨⟨i, f⟩, rfl⟩ ?_ _ ⟨⟨k, g⟩, rfl⟩⟩

Result:
case intro.intro.intro.intro.intro.intro
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i✝ : J
hi : i✝ ⟶ j
hf : (range (F.map hi)).Finite
m : Finset (F.obj j)
hmin : ∀ 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 ∈ range fun f => range (F.map f.snd),
    a ≤ (fun f => range (F.map f.snd)) ⟨i, f⟩ → (fun f => range (F.map f.snd)) ⟨i, f⟩ ≤ a

Proof state:
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j : J
⊢ ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ j), range (F.map f) ⊆ range (F.map g)

Tactic:
obtain ⟨i, hi, hf⟩ := h j

Result:
case intro.intro
J : Type u
inst✝¹ : Category.{u_1, u} J
F : J ⥤ Type v
inst✝ : IsCofilteredOrEmpty J
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
j i : J
hi : i ⟶ j
hf : (range (F.map hi)).Finite
⊢ ∃ i f, ∀ ⦃k : J⦄ (g : k ⟶ j), range (F.map f) ⊆ range (F.map g)