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

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

tactic: obtain ⟨i, hi, hf⟩ := h 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
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)

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 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)

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 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)

tactic: rintro _ ⟨⟨k', g'⟩, rfl⟩ hl
state_before: case intro.intro.intro.intro.intro.intro
J : Type u
inst✝¹ : Category 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

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 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' }

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 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 }

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 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 }