Theorem: CategoryTheory.Sheaf.isDiscrete_iff_of_equivalence
File: Mathlib/CategoryTheory/Sites/Discrete.lean

Proof steps:
state_before: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
⊢ let e := sheafEquiv G J K A;
  IsDiscrete J ht (e.inverse.obj F) ↔ IsDiscrete K ht' F
state_after: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
⊢ IsDiscrete J ht (e.inverse.obj F) ↔ IsDiscrete K ht' F
tactic: intro e
state_before: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
⊢ IsDiscrete J ht (e.inverse.obj F) ↔ IsDiscrete K ht' F
state_after: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this : (constantSheaf K A).Faithful
⊢ IsDiscrete J ht (e.inverse.obj F) ↔ IsDiscrete K ht' F
tactic: have : (constantSheaf K A).Faithful :=
      Functor.Faithful.of_iso (equivCommuteConstant J A ht K G ht')
state_before: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this : (constantSheaf K A).Faithful
⊢ IsDiscrete J ht (e.inverse.obj F) ↔ IsDiscrete K ht' F
state_after: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this✝ : (constantSheaf K A).Faithful
this : (constantSheaf K A).Full
⊢ IsDiscrete J ht (e.inverse.obj F) ↔ IsDiscrete K ht' F
tactic: have : (constantSheaf K A).Full :=
    Functor.Full.of_iso (equivCommuteConstant J A ht K G ht')
state_before: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this✝ : (constantSheaf K A).Faithful
this : (constantSheaf K A).Full
⊢ IsDiscrete J ht (e.inverse.obj F) ↔ IsDiscrete K ht' F
state_after: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this✝ : (constantSheaf K A).Faithful
this : (constantSheaf K A).Full
⊢ e.inverse.obj F ∈ (constantSheaf J A).essImage ↔ F ∈ (constantSheaf K A).essImage
tactic: simp only [isDiscrete_iff_mem_essImage]
state_before: C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this✝ : (constantSheaf K A).Faithful
this : (constantSheaf K A).Full
⊢ e.inverse.obj F ∈ (constantSheaf J A).essImage ↔ F ∈ (constantSheaf K A).essImage
state_after: case mp
C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this✝ : (constantSheaf K A).Faithful
this : (constantSheaf K A).Full
⊢ e.inverse.obj F ∈ (constantSheaf J A).essImage → F ∈ (constantSheaf K A).essImage

case mpr
C : Type u_1
inst✝¹⁰ : Category.{u_6, u_1} C
J : GrothendieckTopology C
A : Type u_2
inst✝⁹ : Category.{u_5, u_2} A
inst✝⁸ : HasWeakSheafify J A
inst✝⁷ : (constantSheaf J A).Faithful
inst✝⁶ : (constantSheaf J A).Full
t : C
ht : IsTerminal t
D : Type u_3
inst✝⁵ : Category.{u_4, u_3} D
K : GrothendieckTopology D
inst✝⁴ : HasWeakSheafify K A
G : C ⥤ D
inst✝³ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
inst✝² : IsDenseSubsite J K G
ht' : IsTerminal (G.obj t)
inst✝¹ : (constantSheaf J A).Faithful
inst✝ : (constantSheaf J A).Full
F : Sheaf K A
e : Sheaf J A ≌ Sheaf K A := sheafEquiv G J K A
this✝ : (constantSheaf K A).Faithful
this : (constantSheaf K A).Full
⊢ F ∈ (constantSheaf K A).essImage → e.inverse.obj F ∈ (constantSheaf J A).essImage
tactic: constructor