Theorem: CategoryTheory.Subobject.sSup_le
File: Mathlib/CategoryTheory/Subobject/Lattice.lean

tactic: fapply le_of_comm
state_before: C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ sSup s ≤ f

tactic: . dsimp [sSup]
  rw [assoc, image.lift_fac, underlyingIso_hom_comp_eq_mk]
state_before: case w
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ ((underlyingIso (image.ι (smallCoproductDesc s))).hom ≫
        image.lift
          (MonoFactorisation.mk (underlying.obj f) (arrow f)
            (Sigma.desc fun b =>
              Subtype.casesOn b fun g m =>
                underlying.map (homOfLE (_ : ↑(equivShrink (Subobject A)).symm ↑{ val := g, property := m } ≤ f))))) ≫
      arrow f =
    arrow (sSup s)

tactic: refine'(underlyingIso _).hom ≫ image.lift ⟨_, f.arrow, _, _⟩
state_before: case f
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ underlying.obj (sSup s) ⟶ underlying.obj f

tactic: refine' Sigma.desc _
state_before: case f.refine'_1
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ (∐ fun j => underlying.obj (↑(equivShrink (Subobject A)).symm ↑j)) ⟶ underlying.obj f

tactic: rintro ⟨g, m⟩
state_before: case f.refine'_1
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ (b : ↑(↑(equivShrink (Subobject A)) '' s)) → underlying.obj (↑(equivShrink (Subobject A)).symm ↑b) ⟶ underlying.obj f

tactic: refine' underlying.map (homOfLE (k _ _))
state_before: case f.refine'_1.mk
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
g : Shrink (Subobject A)
m : g ∈ ↑(equivShrink (Subobject A)) '' s
⊢ underlying.obj (↑(equivShrink (Subobject A)).symm ↑{ val := g, property := m }) ⟶ underlying.obj f

tactic: simpa [symm_apply_mem_iff_mem_image] using m
state_before: case f.refine'_1.mk
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
g : Shrink (Subobject A)
m : g ∈ ↑(equivShrink (Subobject A)) '' s
⊢ ↑(equivShrink (Subobject A)).symm ↑{ val := g, property := m } ∈ s

tactic: ext
state_before: case f.refine'_2
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ (Sigma.desc fun b =>
        Subtype.casesOn b fun g m =>
          underlying.map (homOfLE (_ : ↑(equivShrink (Subobject A)).symm ↑{ val := g, property := m } ≤ f))) ≫
      arrow f =
    smallCoproductDesc s

tactic: dsimp [smallCoproductDesc]
state_before: case f.refine'_2.h
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
b✝ : ↑(↑(equivShrink (Subobject A)) '' s)
⊢ Sigma.ι (fun j => underlying.obj (↑(equivShrink (Subobject A)).symm ↑j)) b✝ ≫
      (Sigma.desc fun b =>
          Subtype.casesOn b fun g m =>
            underlying.map (homOfLE (_ : ↑(equivShrink (Subobject A)).symm ↑{ val := g, property := m } ≤ f))) ≫
        arrow f =
    Sigma.ι (fun j => underlying.obj (↑(equivShrink (Subobject A)).symm ↑j)) b✝ ≫ smallCoproductDesc s

tactic: simp
state_before: case f.refine'_2.h
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
b✝ : ↑(↑(equivShrink (Subobject A)) '' s)
⊢ Sigma.ι (fun j => underlying.obj (↑(equivShrink (Subobject A)).symm ↑j)) b✝ ≫
      (Sigma.desc fun b => underlying.map (homOfLE (_ : ↑(equivShrink (Subobject A)).symm ↑b ≤ f))) ≫ arrow f =
    Sigma.ι (fun j => underlying.obj (↑(equivShrink (Subobject A)).symm ↑j)) b✝ ≫
      Sigma.desc fun j => arrow (↑(equivShrink (Subobject A)).symm ↑j)

tactic: dsimp [sSup]
state_before: case w
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ ((underlyingIso (image.ι (smallCoproductDesc s))).hom ≫
        image.lift
          (MonoFactorisation.mk (underlying.obj f) (arrow f)
            (Sigma.desc fun b =>
              Subtype.casesOn b fun g m =>
                underlying.map (homOfLE (_ : ↑(equivShrink (Subobject A)).symm ↑{ val := g, property := m } ≤ f))))) ≫
      arrow f =
    arrow (sSup s)

tactic: rw [assoc, image.lift_fac, underlyingIso_hom_comp_eq_mk]
state_before: case w
C : Type u₁
inst✝⁴ : Category C
X Y Z : C
D : Type u₂
inst✝³ : Category D
inst✝² : WellPowered C
inst✝¹ : HasCoproducts C
inst✝ : HasImages C
A : C
s : Set (Subobject A)
f : Subobject A
k : ∀ (g : Subobject A), g ∈ s → g ≤ f
⊢ ((underlyingIso (image.ι (smallCoproductDesc s))).hom ≫
        image.lift
          (MonoFactorisation.mk (underlying.obj f) (arrow f)
            (Sigma.desc fun b => underlying.map (homOfLE (_ : ↑(equivShrink (Subobject A)).symm ↑b ≤ f))))) ≫
      arrow f =
    arrow (mk (image.ι (smallCoproductDesc s)))