Theorem: CategoryTheory.isRightAdjoint_of_preservesLimits_of_solutionSetCondition
File: Mathlib/CategoryTheory/Adjunction/AdjointFunctorTheorems.lean

tactic: refine @isRightAdjointOfStructuredArrowInitials _ _ _ _ G ?_
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
hG : SolutionSetCondition G
⊢ G.IsRightAdjoint
state_after: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
hG : SolutionSetCondition G
⊢ ∀ (A : C), HasInitial (StructuredArrow A G)

tactic: intro A
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
hG : SolutionSetCondition G
⊢ ∀ (A : C), HasInitial (StructuredArrow A G)
state_after: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
hG : SolutionSetCondition G
A : C
⊢ HasInitial (StructuredArrow A G)

tactic: specialize hG A
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
hG : SolutionSetCondition G
A : C
⊢ HasInitial (StructuredArrow A G)
state_after: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
hG : ∃ ι B f, ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
⊢ HasInitial (StructuredArrow A G)

tactic: choose ι B f g using hG
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
hG : ∃ ι B f, ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
⊢ HasInitial (StructuredArrow A G)
state_after: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
⊢ HasInitial (StructuredArrow A G)

tactic: let B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
⊢ HasInitial (StructuredArrow A G)
state_after: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
⊢ HasInitial (StructuredArrow A G)

tactic: have hB' : ∀ A' : StructuredArrow A G, ∃ i, Nonempty (B' i ⟶ A') := by
  intro A'
  obtain ⟨i, _, t⟩ := g _ A'.hom
  exact ⟨i, ⟨StructuredArrow.homMk _ t⟩⟩
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
⊢ HasInitial (StructuredArrow A G)
state_after: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
hB' : ∀ (A' : StructuredArrow A G), ∃ i, Nonempty (B' i ⟶ A')
⊢ HasInitial (StructuredArrow A G)

tactic: obtain ⟨T, hT⟩ := has_weakly_initial_of_weakly_initial_set_and_hasProducts hB'
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
hB' : ∀ (A' : StructuredArrow A G), ∃ i, Nonempty (B' i ⟶ A')
⊢ HasInitial (StructuredArrow A G)
state_after: case intro
J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
hB' : ∀ (A' : StructuredArrow A G), ∃ i, Nonempty (B' i ⟶ A')
T : StructuredArrow A G
hT : ∀ (X : StructuredArrow A G), Nonempty (T ⟶ X)
⊢ HasInitial (StructuredArrow A G)

tactic: apply hasInitial_of_weakly_initial_and_hasWideEqualizers hT
state_before: case intro
J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
hB' : ∀ (A' : StructuredArrow A G), ∃ i, Nonempty (B' i ⟶ A')
T : StructuredArrow A G
hT : ∀ (X : StructuredArrow A G), Nonempty (T ⟶ X)
⊢ HasInitial (StructuredArrow A G)
state_after: no goals

tactic: intro A'
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
⊢ ∀ (A' : StructuredArrow A G), ∃ i, Nonempty (B' i ⟶ A')
state_after: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
A' : StructuredArrow A G
⊢ ∃ i, Nonempty (B' i ⟶ A')

tactic: obtain ⟨i, _, t⟩ := g _ A'.hom
state_before: J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
A' : StructuredArrow A G
⊢ ∃ i, Nonempty (B' i ⟶ A')
state_after: case intro.intro
J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
A' : StructuredArrow A G
i : ι
w✝ : B i ⟶ A'.right
t : f i ≫ G.map w✝ = A'.hom
⊢ ∃ i, Nonempty (B' i ⟶ A')

tactic: exact ⟨i, ⟨StructuredArrow.homMk _ t⟩⟩
state_before: case intro.intro
J : Type v
C : Type u
inst✝³ : Category.{v, u} C
D : Type u
inst✝² : Category.{v, u} D
G : D ⥤ C
inst✝¹ : HasLimits D
inst✝ : PreservesLimits G
A : C
ι : Type v
B : ι → D
f : (i : ι) → A ⟶ G.obj (B i)
g : ∀ (X : D) (h : A ⟶ G.obj X), ∃ i g, f i ≫ G.map g = h
B' : ι → StructuredArrow A G := fun i => StructuredArrow.mk (f i)
A' : StructuredArrow A G
i : ι
w✝ : B i ⟶ A'.right
t : f i ≫ G.map w✝ = A'.hom
⊢ ∃ i, Nonempty (B' i ⟶ A')
state_after: no goals