Theorem: CategoryTheory.regularTopology.isLocallySurjective_sheafOfTypes
File: Mathlib/CategoryTheory/Sites/Coherent/LocallySurjective.lean

tactic: replace h := h.1 y
state_before: C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
h : Presheaf.IsLocallySurjective (coherentTopology C) f
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
⊢ Presheaf.imageSieve f y ∈ (regularTopology C).sieves U✝
state_after: C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
h : Presheaf.imageSieve f y ∈ (coherentTopology C).sieves U✝
⊢ Presheaf.imageSieve f y ∈ (regularTopology C).sieves U✝

tactic: rw [coherentTopology.mem_sieves_iff_hasEffectiveEpiFamily] at h
state_before: C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
h : Presheaf.imageSieve f y ∈ (coherentTopology C).sieves U✝
⊢ Presheaf.imageSieve f y ∈ (regularTopology C).sieves U✝
state_after: C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
h : ∃ α, ∃ (_ : Finite α), ∃ Y π, EffectiveEpiFamily Y π ∧ ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
⊢ Presheaf.imageSieve f y ∈ (regularTopology C).sieves U✝

tactic: obtain ⟨α, _, Z, π, h, h'⟩ := h
state_before: C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
h : ∃ α, ∃ (_ : Finite α), ∃ Y π, EffectiveEpiFamily Y π ∧ ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
⊢ Presheaf.imageSieve f y ∈ (regularTopology C).sieves U✝
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
⊢ Presheaf.imageSieve f y ∈ (regularTopology C).sieves U✝

tactic: rw [mem_sieves_iff_hasEffectiveEpi]
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
⊢ Presheaf.imageSieve f y ∈ (regularTopology C).sieves U✝
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π

tactic: let x : (a : α) → (F.obj ⟨Z a⟩) := fun a ↦ (h' a).choose
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π

tactic: let _ : Fintype α := Fintype.ofFinite _
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π

tactic: let i' : ((a : α) → (F.obj ⟨Z a⟩)) ≅ (F.obj ⟨∐ Z⟩) := (Types.productIso _).symm ≪≫
  (PreservesProduct.iso F _).symm ≪≫ F.mapIso (opCoproductIsoProduct _).symm
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π

tactic: refine ⟨∐ Z, Sigma.desc π, inferInstance, i'.hom x, ?_⟩
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
⊢ ∃ Y π, EffectiveEpi π ∧ (Presheaf.imageSieve f y).arrows π
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
⊢ (f.app { unop := ∐ Z }) (i'.hom x) = (G.map (Sigma.desc π).op) y

tactic: have := preservesLimitsOfShapeOfEquiv (Discrete.opposite α).symm G
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
⊢ (f.app { unop := ∐ Z }) (i'.hom x) = (G.map (Sigma.desc π).op) y
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
⊢ (f.app { unop := ∐ Z }) (i'.hom x) = (G.map (Sigma.desc π).op) y

tactic: apply Concrete.isLimit_ext _ (isLimitOfPreserves G (coproductIsCoproduct Z).op)
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
⊢ (f.app { unop := ∐ Z }) (i'.hom x) = (G.map (Sigma.desc π).op) y
state_after: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
⊢ ∀ (j : (Discrete α)ᵒᵖ),
    ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app j) ((f.app { unop := ∐ Z }) (i'.hom x)) =
      ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app j) ((G.map (Sigma.desc π).op) y)

tactic: intro ⟨⟨a⟩⟩
state_before: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
⊢ ∀ (j : (Discrete α)ᵒᵖ),
    ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app j) ((f.app { unop := ∐ Z }) (i'.hom x)) =
      ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app j) ((G.map (Sigma.desc π).op) y)
state_after: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
⊢ ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app { unop := { as := a } })
      ((f.app { unop := ∐ Z }) (i'.hom x)) =
    ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app { unop := { as := a } }) ((G.map (Sigma.desc π).op) y)

tactic: simp only [Functor.comp_obj, Functor.op_obj, Discrete.functor_obj, Functor.mapCone_pt,
  Cocone.op_pt, Cofan.mk_pt, Functor.const_obj_obj, Functor.mapCone_π_app, Cocone.op_π,
  NatTrans.op_app, Cofan.mk_ι_app, Functor.mapIso_symm, Iso.symm_hom, Iso.trans_hom,
  Functor.mapIso_inv, types_comp_apply, i', ← NatTrans.naturality_apply]
state_before: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
⊢ ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app { unop := { as := a } })
      ((f.app { unop := ∐ Z }) (i'.hom x)) =
    ((G.mapCone (Cocone.op (Cofan.mk (∐ Z) (Sigma.ι Z)))).π.app { unop := { as := a } }) ((G.map (Sigma.desc π).op) y)
state_after: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
⊢ (f.app { unop := Z a })
      ((F.map (Sigma.ι Z a).op)
        (F.map (opCoproductIsoProduct Z).inv
          ((PreservesProduct.iso F fun a => { unop := Z a }).inv
            ((Types.productIso fun a => F.obj { unop := Z a }).inv x)))) =
    (G.map (Sigma.ι Z a).op) ((G.map (Sigma.desc π).op) y)

tactic: have : f.app ⟨Z a⟩ (x a) = G.map (π a).op y := (h' a).choose_spec
state_before: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
⊢ (f.app { unop := Z a })
      ((F.map (Sigma.ι Z a).op)
        (F.map (opCoproductIsoProduct Z).inv
          ((PreservesProduct.iso F fun a => { unop := Z a }).inv
            ((Types.productIso fun a => F.obj { unop := Z a }).inv x)))) =
    (G.map (Sigma.ι Z a).op) ((G.map (Sigma.desc π).op) y)
state_after: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
⊢ (f.app { unop := Z a })
      ((F.map (Sigma.ι Z a).op)
        (F.map (opCoproductIsoProduct Z).inv
          ((PreservesProduct.iso F fun a => { unop := Z a }).inv
            ((Types.productIso fun a => F.obj { unop := Z a }).inv x)))) =
    (G.map (Sigma.ι Z a).op) ((G.map (Sigma.desc π).op) y)

tactic: convert this
state_before: case intro.intro.intro.intro.intro.a
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
⊢ (f.app { unop := Z a })
      ((F.map (Sigma.ι Z a).op)
        (F.map (opCoproductIsoProduct Z).inv
          ((PreservesProduct.iso F fun a => { unop := Z a }).inv
            ((Types.productIso fun a => F.obj { unop := Z a }).inv x)))) =
    (G.map (Sigma.ι Z a).op) ((G.map (Sigma.desc π).op) y)
state_after: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ (F.map (Sigma.ι Z a).op)
      (F.map (opCoproductIsoProduct Z).inv
        ((PreservesProduct.iso F fun a => { unop := Z a }).inv
          ((Types.productIso fun a => F.obj { unop := Z a }).inv x))) =
    x a

case h.e'_3.h
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ (G.map (Sigma.ι Z a).op) ((G.map (Sigma.desc π).op) y) = G.map (π a).op y

tactic: change F.map _ (F.map _ _) = _
state_before: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ (F.map (Sigma.ι Z a).op)
      (F.map (opCoproductIsoProduct Z).inv
        ((PreservesProduct.iso F fun a => { unop := Z a }).inv
          ((Types.productIso fun a => F.obj { unop := Z a }).inv x))) =
    x a
state_after: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ F.map (Sigma.ι Z a).op
      (F.map (opCoproductIsoProduct Z).inv
        ((PreservesProduct.iso F fun a => { unop := Z a }).inv
          ((Types.productIso fun a => F.obj { unop := Z a }).inv x))) =
    x a

tactic: rw [← FunctorToTypes.map_comp_apply, opCoproductIsoProduct_inv_comp_ι, ← piComparison_comp_π]
state_before: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ F.map (Sigma.ι Z a).op
      (F.map (opCoproductIsoProduct Z).inv
        ((PreservesProduct.iso F fun a => { unop := Z a }).inv
          ((Types.productIso fun a => F.obj { unop := Z a }).inv x))) =
    x a
state_after: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ ((piComparison F fun x => { unop := Z x }) ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a

tactic: change ((PreservesProduct.iso F _).hom ≫ _) _ = _
state_before: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ ((piComparison F fun x => { unop := Z x }) ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a
state_after: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ ((PreservesProduct.iso F fun x => { unop := Z x }).hom ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a

tactic: have := Types.productIso_hom_comp_eval (fun a ↦ F.obj (op (Z a))) a
state_before: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ ((PreservesProduct.iso F fun x => { unop := Z x }).hom ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a
state_after: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝¹ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this✝ : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
this : ((Types.productIso fun a => F.obj { unop := Z a }).hom ≫ fun f => f a) = Pi.π (fun a => F.obj { unop := Z a }) a
⊢ ((PreservesProduct.iso F fun x => { unop := Z x }).hom ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a

tactic: rw [← Iso.eq_inv_comp] at this
state_before: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝¹ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this✝ : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
this : ((Types.productIso fun a => F.obj { unop := Z a }).hom ≫ fun f => f a) = Pi.π (fun a => F.obj { unop := Z a }) a
⊢ ((PreservesProduct.iso F fun x => { unop := Z x }).hom ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a
state_after: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝¹ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this✝ : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
this : (fun f => f a) = (Types.productIso fun a => F.obj { unop := Z a }).inv ≫ Pi.π (fun a => F.obj { unop := Z a }) a
⊢ ((PreservesProduct.iso F fun x => { unop := Z x }).hom ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a

tactic: simp only [types_comp_apply, inv_hom_id_apply, congrFun this x]
state_before: case h.e'_2.h.h.e'_1
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝¹ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this✝ : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
this : (fun f => f a) = (Types.productIso fun a => F.obj { unop := Z a }).inv ≫ Pi.π (fun a => F.obj { unop := Z a }) a
⊢ ((PreservesProduct.iso F fun x => { unop := Z x }).hom ≫ Pi.π (fun b => F.obj { unop := Z b }) a)
      ((PreservesProduct.iso F fun a => { unop := Z a }).inv
        ((Types.productIso fun a => F.obj { unop := Z a }).inv x)) =
    x a
state_after: no goals

tactic: change G.map _ (G.map _ _) = _
state_before: case h.e'_3.h
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ (G.map (Sigma.ι Z a).op) ((G.map (Sigma.desc π).op) y) = G.map (π a).op y
state_after: case h.e'_3.h
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ G.map (Sigma.ι Z a).op (G.map (Sigma.desc π).op y) = G.map (π a).op y

tactic: simp only [← FunctorToTypes.map_comp_apply, ← op_comp, Sigma.ι_desc]
state_before: case h.e'_3.h
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{u_3, u_1} C
inst✝⁵ : Category.{?u.24257, u_2} D
inst✝⁴ : ConcreteCategory D
inst✝³ : Preregular C
inst✝² : FinitaryPreExtensive C
F G : Cᵒᵖ ⥤ Type w
f : F ⟶ G
inst✝¹ : PreservesFiniteProducts F
inst✝ : PreservesFiniteProducts G
U✝ : C
y : (forget (Type w)).obj (G.obj { unop := U✝ })
α : Type
w✝ : Finite α
Z : α → C
π : (a : α) → Z a ⟶ U✝
h : EffectiveEpiFamily Z π
h' : ∀ (a : α), (Presheaf.imageSieve f y).arrows (π a)
x : (a : α) → F.obj { unop := Z a } := fun a => Exists.choose ⋯
x✝ : Fintype α := Fintype.ofFinite α
i' : ((a : α) → F.obj { unop := Z a }) ≅ F.obj { unop := ∐ Z } :=
  (Types.productIso fun a => F.obj { unop := Z a }).symm ≪≫
    (PreservesProduct.iso F fun a => { unop := Z a }).symm ≪≫ F.mapIso (opCoproductIsoProduct Z).symm
this✝ : PreservesLimitsOfShape (Discrete α)ᵒᵖ G
a : α
this : f.app { unop := Z a } (x a) = G.map (π a).op y
e_1✝ : (forget (Type w)).obj (G.obj { unop := Z a }) = G.obj { unop := Z a }
⊢ G.map (Sigma.ι Z a).op (G.map (Sigma.desc π).op y) = G.map (π a).op y
state_after: no goals