Theorem: CategoryTheory.regularTopology.isSheaf_yoneda_obj
File: Mathlib/CategoryTheory/Sites/Coherent/RegularSheaves.lean

tactic: rw [regularTopology, isSheaf_coverage]
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W : C
⊢ IsSheaf (regularTopology C) (yoneda.obj W)
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W : C
⊢ ∀ {X : C}, ∀ R ∈ (regularCoverage C).covering X, IsSheafFor (yoneda.obj W) R

tactic: intro X S ⟨_, hS⟩
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W : C
⊢ ∀ {X : C}, ∀ R ∈ (regularCoverage C).covering X, IsSheafFor (yoneda.obj W) R
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X : C
S : Presieve X
w✝ : C
hS : ∃ f, (S = ofArrows (fun x => w✝) fun x => f) ∧ EffectiveEpi f
⊢ IsSheafFor (yoneda.obj W) S

tactic: have : S.regular := ⟨_, hS⟩
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X : C
S : Presieve X
w✝ : C
hS : ∃ f, (S = ofArrows (fun x => w✝) fun x => f) ∧ EffectiveEpi f
⊢ IsSheafFor (yoneda.obj W) S
state_after: C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X : C
S : Presieve X
w✝ : C
hS : ∃ f, (S = ofArrows (fun x => w✝) fun x => f) ∧ EffectiveEpi f
this : S.regular
⊢ IsSheafFor (yoneda.obj W) S

tactic: obtain ⟨Y, f, rfl, hf⟩ := Presieve.regular.single_epi (R := S)
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X : C
S : Presieve X
w✝ : C
hS : ∃ f, (S = ofArrows (fun x => w✝) fun x => f) ∧ EffectiveEpi f
this : S.regular
⊢ IsSheafFor (yoneda.obj W) S
state_after: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
⊢ IsSheafFor (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)

tactic: have h_colim := isColimitOfEffectiveEpiStruct f hf.effectiveEpi.some
state_before: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
⊢ IsSheafFor (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
state_after: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generateSingleton f).arrows.cocone
⊢ IsSheafFor (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)

tactic: rw [← Sieve.generateSingleton_eq, ← Presieve.ofArrows_pUnit] at h_colim
state_before: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generateSingleton f).arrows.cocone
⊢ IsSheafFor (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
state_after: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
⊢ IsSheafFor (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)

tactic: intro x hx
state_before: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
⊢ IsSheafFor (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
state_after: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
⊢ ∃! t, x.IsAmalgamation t

tactic: let x_ext := Presieve.FamilyOfElements.sieveExtend x
state_before: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
⊢ ∃! t, x.IsAmalgamation t
state_after: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
⊢ ∃! t, x.IsAmalgamation t

tactic: have hx_ext := Presieve.FamilyOfElements.Compatible.sieveExtend hx
state_before: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
⊢ ∃! t, x.IsAmalgamation t
state_after: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
⊢ ∃! t, x.IsAmalgamation t

tactic: let S := Sieve.generate (Presieve.ofArrows (fun () ↦ Y) (fun () ↦ f))
state_before: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
⊢ ∃! t, x.IsAmalgamation t
state_after: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
⊢ ∃! t, x.IsAmalgamation t

tactic: obtain ⟨t, t_amalg, t_uniq⟩ :=
  (Sieve.forallYonedaIsSheaf_iff_colimit S).mpr ⟨h_colim⟩ W x_ext hx_ext
state_before: case intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
⊢ ∃! t, x.IsAmalgamation t
state_after: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ ∃! t, x.IsAmalgamation t

tactic: refine ⟨t, ?_, ?_⟩
state_before: case intro.intro.intro.intro.intro
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ ∃! t, x.IsAmalgamation t
state_after: case intro.intro.intro.intro.intro.refine_1
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ (fun t => x.IsAmalgamation t) t

case intro.intro.intro.intro.intro.refine_2
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x.IsAmalgamation t) y → y = t

tactic: convert Presieve.isAmalgamation_restrict (Sieve.le_generate
  (Presieve.ofArrows (fun () ↦ Y) (fun () ↦ f))) _ _ t_amalg
state_before: case intro.intro.intro.intro.intro.refine_1
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ (fun t => x.IsAmalgamation t) t
state_after: case h.e.h.e'_6.h.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ x = FamilyOfElements.restrict ⋯ x_ext

tactic: exact (Presieve.restrict_extend hx).symm
state_before: case h.e.h.e'_6.h.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ x = FamilyOfElements.restrict ⋯ x_ext
state_after: no goals

tactic: exact fun y hy ↦ t_uniq y <| Presieve.isAmalgamation_sieveExtend x y hy
state_before: case intro.intro.intro.intro.intro.refine_2
C : Type u_1
D : Type u_2
E : Type u_3
inst✝³ : Category.{u_4, u_1} C
inst✝² : Category.{?u.133468, u_2} D
inst✝¹ : Category.{?u.133472, u_3} E
inst✝ : Preregular C
W X w✝ Y : C
f : Y ⟶ X
hf : EffectiveEpi f
hS : ∃ f_1, ((ofArrows (fun x => Y) fun x => f) = ofArrows (fun x => w✝) fun x => f_1) ∧ EffectiveEpi f_1
this : (ofArrows (fun x => Y) fun x => f).regular
h_colim : IsColimit (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows.cocone
x : FamilyOfElements (yoneda.obj W) (ofArrows (fun x => Y) fun x => f)
hx : x.Compatible
x_ext : FamilyOfElements (yoneda.obj W) (Sieve.generate (ofArrows (fun x => Y) fun x => f)).arrows := x.sieveExtend
hx_ext : x.sieveExtend.Compatible
S : Sieve X :=
  Sieve.generate
    (ofArrows (fun x => Y) fun x =>
      match x with
      | PUnit.unit => f)
t : (yoneda.obj W).obj { unop := X }
t_amalg : x_ext.IsAmalgamation t
t_uniq : ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x_ext.IsAmalgamation t) y → y = t
⊢ ∀ (y : (yoneda.obj W).obj { unop := X }), (fun t => x.IsAmalgamation t) y → y = t
state_after: no goals