Theorem: CategoryTheory.Presieve.isSheafFor_arrows_iff
File: Mathlib/CategoryTheory/Sites/IsSheafFor.lean

tactic: refine ⟨fun h x hx ↦ ?_, fun h x hx ↦ ?_⟩
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
⊢ IsSheafFor P (ofArrows X π) ↔
    ∀ (x : (i : I) → P.obj { unop := X i }), Arrows.Compatible P π x → ∃! t, ∀ (i : I), P.map (π i).op t = x i
state_after: case refine_1
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
⊢ ∃! t, ∀ (i : I), P.map (π i).op t = x i

case refine_2
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : ∀ (x : (i : I) → P.obj { unop := X i }), Arrows.Compatible P π x → ∃! t, ∀ (i : I), P.map (π i).op t = x i
x : FamilyOfElements P (ofArrows X π)
hx : x.Compatible
⊢ ∃! t, x.IsAmalgamation t

tactic: obtain ⟨t, ht₁, ht₂⟩ := h _ hx.familyOfElements_compatible
state_before: case refine_1
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
⊢ ∃! t, ∀ (i : I), P.map (π i).op t = x i
state_after: case refine_1.intro.intro
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
t : P.obj { unop := B }
ht₁ : hx.familyOfElements.IsAmalgamation t
ht₂ : ∀ (y : P.obj { unop := B }), (fun t => hx.familyOfElements.IsAmalgamation t) y → y = t
⊢ ∃! t, ∀ (i : I), P.map (π i).op t = x i

tactic: refine ⟨t, fun i ↦ ?_, fun t' ht' ↦ ht₂ _ fun _ _ ⟨i⟩ ↦ ?_⟩
state_before: case refine_1.intro.intro
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
t : P.obj { unop := B }
ht₁ : hx.familyOfElements.IsAmalgamation t
ht₂ : ∀ (y : P.obj { unop := B }), (fun t => hx.familyOfElements.IsAmalgamation t) y → y = t
⊢ ∃! t, ∀ (i : I), P.map (π i).op t = x i
state_after: case refine_1.intro.intro.refine_1
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
t : P.obj { unop := B }
ht₁ : hx.familyOfElements.IsAmalgamation t
ht₂ : ∀ (y : P.obj { unop := B }), (fun t => hx.familyOfElements.IsAmalgamation t) y → y = t
i : I
⊢ P.map (π i).op t = x i

case refine_1.intro.intro.refine_2
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
t : P.obj { unop := B }
ht₁ : hx.familyOfElements.IsAmalgamation t
ht₂ : ∀ (y : P.obj { unop := B }), (fun t => hx.familyOfElements.IsAmalgamation t) y → y = t
t' : P.obj { unop := B }
ht' : (fun t => ∀ (i : I), P.map (π i).op t = x i) t'
x✝² : C
x✝¹ : x✝² ⟶ B
x✝ : ofArrows X π x✝¹
i : I
⊢ P.map (π i).op t' = hx.familyOfElements (π i) ⋯

tactic: rw [ht₁ _ (ofArrows.mk i), hx.familyOfElements_ofArrows_mk]
state_before: case refine_1.intro.intro.refine_1
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
t : P.obj { unop := B }
ht₁ : hx.familyOfElements.IsAmalgamation t
ht₂ : ∀ (y : P.obj { unop := B }), (fun t => hx.familyOfElements.IsAmalgamation t) y → y = t
i : I
⊢ P.map (π i).op t = x i
state_after: no goals

tactic: rw [ht', hx.familyOfElements_ofArrows_mk]
state_before: case refine_1.intro.intro.refine_2
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : IsSheafFor P (ofArrows X π)
x : (i : I) → P.obj { unop := X i }
hx : Arrows.Compatible P π x
t : P.obj { unop := B }
ht₁ : hx.familyOfElements.IsAmalgamation t
ht₂ : ∀ (y : P.obj { unop := B }), (fun t => hx.familyOfElements.IsAmalgamation t) y → y = t
t' : P.obj { unop := B }
ht' : (fun t => ∀ (i : I), P.map (π i).op t = x i) t'
x✝² : C
x✝¹ : x✝² ⟶ B
x✝ : ofArrows X π x✝¹
i : I
⊢ P.map (π i).op t' = hx.familyOfElements (π i) ⋯
state_after: no goals

tactic: obtain ⟨t, hA, ht⟩ := h (fun i ↦ x (π i) (ofArrows.mk _))
  (fun i j Z gi gj ↦ hx gi gj (ofArrows.mk _) (ofArrows.mk _))
state_before: case refine_2
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : ∀ (x : (i : I) → P.obj { unop := X i }), Arrows.Compatible P π x → ∃! t, ∀ (i : I), P.map (π i).op t = x i
x : FamilyOfElements P (ofArrows X π)
hx : x.Compatible
⊢ ∃! t, x.IsAmalgamation t
state_after: case refine_2.intro.intro
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : ∀ (x : (i : I) → P.obj { unop := X i }), Arrows.Compatible P π x → ∃! t, ∀ (i : I), P.map (π i).op t = x i
x : FamilyOfElements P (ofArrows X π)
hx : x.Compatible
t : P.obj { unop := B }
hA : ∀ (i : I), P.map (π i).op t = x (π i) ⋯
ht : ∀ (y : P.obj { unop := B }), (fun t => ∀ (i : I), P.map (π i).op t = x (π i) ⋯) y → y = t
⊢ ∃! t, x.IsAmalgamation t

tactic: exact ⟨t, fun Y f ⟨i⟩ ↦ hA i, fun y hy ↦ ht y (fun i ↦ hy (π i) (ofArrows.mk _))⟩
state_before: case refine_2.intro.intro
C : Type u₁
inst✝ : Category.{v₁, u₁} C
P Q U : Cᵒᵖ ⥤ Type w
X✝ Y : C
S : Sieve X✝
R : Presieve X✝
B : C
I : Type u_1
X : I → C
π : (i : I) → X i ⟶ B
h : ∀ (x : (i : I) → P.obj { unop := X i }), Arrows.Compatible P π x → ∃! t, ∀ (i : I), P.map (π i).op t = x i
x : FamilyOfElements P (ofArrows X π)
hx : x.Compatible
t : P.obj { unop := B }
hA : ∀ (i : I), P.map (π i).op t = x (π i) ⋯
ht : ∀ (y : P.obj { unop := B }), (fun t => ∀ (i : I), P.map (π i).op t = x (π i) ⋯) y → y = t
⊢ ∃! t, x.IsAmalgamation t
state_after: no goals