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

tactic: intro 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
h : ∀ (j : J), ∃ i f, (range (F.map f)).Finite
⊢ F.IsMittagLeffler
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
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
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
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)
state_after: 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, (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⟩
state_before: 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, (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)
state_after: 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, (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⟩⟩
state_before: 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, (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)
state_after: 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, (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
state_before: 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, (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
state_after: 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, (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
state_before: 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, (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'⟩
state_after: 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, (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⟩
state_before: 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, (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⟩
state_after: 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, (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
state_before: 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, (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⟩
state_after: no goals