Theorem: CategoryTheory.PresheafHom.isAmalgamation_iff
File: Mathlib/CategoryTheory/Sites/SheafHom.lean

tactic: constructor
state_before: C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
⊢ x.IsAmalgamation y ↔
    ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
state_after: case mp
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
⊢ x.IsAmalgamation y →
    ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }

case mpr
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
⊢ (∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }) →
    x.IsAmalgamation y

tactic: intro h Y g hg
state_before: case mp
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
⊢ x.IsAmalgamation y →
    ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
state_after: case mp
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : x.IsAmalgamation y
Y : C
g : Y ⟶ X
hg : S.arrows g
⊢ y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }

tactic: rw [← h g hg, presheafHom_map_app_op_mk_id]
state_before: case mp
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : x.IsAmalgamation y
Y : C
g : Y ⟶ X
hg : S.arrows g
⊢ y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
state_after: no goals

tactic: intro h Y g hg
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
⊢ (∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }) →
    x.IsAmalgamation y
state_after: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
⊢ (presheafHom F G).map g.op y = x g hg

tactic: ext ⟨W : Over Y⟩
state_before: case mpr
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
⊢ (presheafHom F G).map g.op y = x g hg
state_after: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
⊢ ((presheafHom F G).map g.op y).app { unop := W } = (x g hg).app { unop := W }

tactic: refine (h W.left (W.hom ≫ g) (S.downward_closed hg _)).trans ?_
state_before: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
⊢ ((presheafHom F G).map g.op y).app { unop := W } = (x g hg).app { unop := W }
state_after: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }

tactic: have H := hx (𝟙 _) W.hom (S.downward_closed hg W.hom) hg (by simp)
state_before: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }
state_after: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : (presheafHom F G).map (𝟙 ((𝟭 C).obj W.left)).op (x (W.hom ≫ g) ⋯) = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }

tactic: dsimp at H
state_before: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : (presheafHom F G).map (𝟙 ((𝟭 C).obj W.left)).op (x (W.hom ≫ g) ⋯) = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }
state_after: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : (presheafHom F G).map (𝟙 { unop := W.left }) (x (W.hom ≫ g) ⋯) = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }

tactic: simp only [Functor.map_id, FunctorToTypes.map_id_apply] at H
state_before: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : (presheafHom F G).map (𝟙 { unop := W.left }) (x (W.hom ≫ g) ⋯) = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }
state_after: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : x (W.hom ≫ g) ⋯ = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }

tactic: rw [H, presheafHom_map_app_op_mk_id]
state_before: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : x (W.hom ≫ g) ⋯ = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x (W.hom ≫ g) ⋯).app { unop := Over.mk (𝟙 W.left) } = (x g hg).app { unop := W }
state_after: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : x (W.hom ≫ g) ⋯ = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x g hg).app { unop := Over.mk W.hom } = (x g hg).app { unop := W }

tactic: rfl
state_before: case mpr.w.h.op
C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
H : x (W.hom ≫ g) ⋯ = (presheafHom F G).map W.hom.op (x g hg)
⊢ (x g hg).app { unop := Over.mk W.hom } = (x g hg).app { unop := W }
state_after: no goals

tactic: simp
state_before: C : Type u
inst✝¹ : Category.{v, u} C
J : GrothendieckTopology C
A : Type u'
inst✝ : Category.{v', u'} A
F G : Cᵒᵖ ⥤ A
X : C
S : Sieve X
x : Presieve.FamilyOfElements (presheafHom F G) S.arrows
hx : x.Compatible
y : (presheafHom F G).obj { unop := X }
h : ∀ (Y : C) (g : Y ⟶ X) (hg : S.arrows g), y.app { unop := Over.mk g } = (x g hg).app { unop := Over.mk (𝟙 Y) }
Y : C
g : Y ⟶ X
hg : S.arrows g
W : Over Y
⊢ 𝟙 ((𝟭 C).obj W.left) ≫ W.hom ≫ g = W.hom ≫ g
state_after: no goals