Theorem: CategoryTheory.CoverDense.compatiblePreserving
File: Mathlib/CategoryTheory/Sites/DenseSubsite.lean

tactic: constructor
state_before: C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
⊢ CompatiblePreserving K G

tactic: intro ℱ Z T x hx Y₁ Y₂ X f₁ f₂ g₁ g₂ hg₁ hg₂ eq
state_before: case Compatible
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
⊢ ∀ (ℱ : SheafOfTypes K) {Z : C} {T : Presieve Z} {x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T},
    FamilyOfElements.Compatible x →
      ∀ {Y₁ Y₂ : C} {X : D} (f₁ : X ⟶ G.obj Y₁) (f₂ : X ⟶ G.obj Y₂) {g₁ : Y₁ ⟶ Z} {g₂ : Y₂ ⟶ Z} (hg₁ : T g₁)
        (hg₂ : T g₂), f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂ → ℱ.val.map f₁.op (x g₁ hg₁) = ℱ.val.map f₂.op (x g₂ hg₂)

tactic: apply H.ext
state_before: case Compatible
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
⊢ ℱ.val.map f₁.op (x g₁ hg₁) = ℱ.val.map f₂.op (x g₂ hg₂)

tactic: intro W i
state_before: case Compatible.h
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
⊢ ∀ ⦃Y : C⦄ (f : G.obj Y ⟶ X), ℱ.val.map f.op (ℱ.val.map f₁.op (x g₁ hg₁)) = ℱ.val.map f.op (ℱ.val.map f₂.op (x g₂ hg₂))

tactic: simp only [← FunctorToTypes.map_comp_apply, ← op_comp]
state_before: case Compatible.h
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
W : C
i : G.obj W ⟶ X
⊢ ℱ.val.map i.op (ℱ.val.map f₁.op (x g₁ hg₁)) = ℱ.val.map i.op (ℱ.val.map f₂.op (x g₂ hg₂))

tactic: rw [← G.image_preimage (i ≫ f₁)]
state_before: case Compatible.h
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
W : C
i : G.obj W ⟶ X
⊢ ℱ.val.map (i ≫ f₁).op (x g₁ hg₁) = ℱ.val.map (i ≫ f₂).op (x g₂ hg₂)

tactic: rw [← G.image_preimage (i ≫ f₂)]
state_before: case Compatible.h
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
W : C
i : G.obj W ⟶ X
⊢ ℱ.val.map (G.map (G.preimage (i ≫ f₁))).op (x g₁ hg₁) = ℱ.val.map (i ≫ f₂).op (x g₂ hg₂)

tactic: apply hx
state_before: case Compatible.h
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
W : C
i : G.obj W ⟶ X
⊢ ℱ.val.map (G.map (G.preimage (i ≫ f₁))).op (x g₁ hg₁) = ℱ.val.map (G.map (G.preimage (i ≫ f₂))).op (x g₂ hg₂)

tactic: apply G.map_injective
state_before: case Compatible.h.a
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
W : C
i : G.obj W ⟶ X
⊢ Full.preimage (i ≫ f₁) ≫ g₁ = Full.preimage (i ≫ f₂) ≫ g₂

tactic: simp [eq]
state_before: case Compatible.h.a.a
C : Type u_3
inst✝⁵ : Category C
D : Type u_4
inst✝⁴ : Category D
E : Type ?u.142420
inst✝³ : Category E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type ?u.142472
inst✝² : Category A
G : C ⥤ D
H : CoverDense K G
inst✝¹ : Full G
ℱ✝ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
inst✝ : Faithful G
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x : FamilyOfElements (Functor.op G ⋙ ℱ.val) T
hx : FamilyOfElements.Compatible x
Y₁ Y₂ : C
X : D
f₁ : X ⟶ G.obj Y₁
f₂ : X ⟶ G.obj Y₂
g₁ : Y₁ ⟶ Z
g₂ : Y₂ ⟶ Z
hg₁ : T g₁
hg₂ : T g₂
eq : f₁ ≫ G.map g₁ = f₂ ≫ G.map g₂
W : C
i : G.obj W ⟶ X
⊢ G.map (Full.preimage (i ≫ f₁) ≫ g₁) = G.map (Full.preimage (i ≫ f₂) ≫ g₂)