Theorem: Sieve.yonedaFamily_fromCocone_compatible (ExtrDisc/Topologies.lean)

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
⊢ FamilyOfElements.Compatible (yonedaFamilyOfElements_fromCocone S s)
Tactic:
intro Y₁ Y₂ Z g₁ g₂ f₁ f₂ hf₁ hf₂ hgf
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
⊢ (yoneda.obj s.pt).map g₁.op (yonedaFamilyOfElements_fromCocone S s f₁ hf₁) =
    (yoneda.obj s.pt).map g₂.op (yonedaFamilyOfElements_fromCocone S s f₂ hf₂)

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
⊢ (yoneda.obj s.pt).map g₁.op (yonedaFamilyOfElements_fromCocone S s f₁ hf₁) =
    (yoneda.obj s.pt).map g₂.op (yonedaFamilyOfElements_fromCocone S s f₂ hf₂)
Tactic:
have := s.ι.naturality
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
⊢ (yoneda.obj s.pt).map g₁.op (yonedaFamilyOfElements_fromCocone S s f₁ hf₁) =
    (yoneda.obj s.pt).map g₂.op (yonedaFamilyOfElements_fromCocone S s f₂ hf₂)

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
⊢ (yoneda.obj s.pt).map g₁.op (yonedaFamilyOfElements_fromCocone S s f₁ hf₁) =
    (yoneda.obj s.pt).map g₂.op (yonedaFamilyOfElements_fromCocone S s f₂ hf₂)
Tactic:
simp
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
⊢ g₁ ≫ yonedaFamilyOfElements_fromCocone S s f₁ hf₁ = g₂ ≫ yonedaFamilyOfElements_fromCocone S s f₂ hf₂

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
⊢ g₁ ≫ yonedaFamilyOfElements_fromCocone S s f₁ hf₁ = g₂ ≫ yonedaFamilyOfElements_fromCocone S s f₂ hf₂
Tactic:
dsimp [yonedaFamilyOfElements_fromCocone]
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
have hgf₁ : S.arrows (g₁ ≫ f₁) := by exact Sieve.downward_closed S hf₁ g₁
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
have hgf₂ : S.arrows (g₂ ≫ f₂) := by exact Sieve.downward_closed S hf₂ g₂
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
let F : (Over.mk (g₁ ≫ f₁) : Over X) ⟶ (Over.mk (g₂ ≫ f₂) : Over X) := (Over.homMk (𝟙 Z) )
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
let F₁ : (Over.mk (g₁ ≫ f₁) : Over X) ⟶ (Over.mk f₁ : Over X) := (Over.homMk g₁)
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
let F₂ : (Over.mk (g₂ ≫ f₂) : Over X) ⟶ (Over.mk f₂ : Over X) := (Over.homMk g₂)
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
have hF := @this ⟨Over.mk (g₁ ≫ f₁), hgf₁⟩ ⟨Over.mk (g₂ ≫ f₂), hgf₂⟩ F
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
have hF₁ := @this ⟨Over.mk (g₁ ≫ f₁), hgf₁⟩ ⟨Over.mk f₁, hf₁⟩ F₁
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
hF₁ :
  (diagram S.arrows).map F₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₁
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
hF₁ :
  (diagram S.arrows).map F₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₁
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
have hF₂ := @this ⟨Over.mk (g₂ ≫ f₂), hgf₂⟩ ⟨Over.mk f₂, hf₂⟩ F₂
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
hF₁ :
  (diagram S.arrows).map F₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₁
hF₂ :
  (diagram S.arrows).map F₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ } =
    s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₂
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
hF₁ :
  (diagram S.arrows).map F₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₁
hF₂ :
  (diagram S.arrows).map F₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ } =
    s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₂
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
simp at this ⊢
State after:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
hF₁ :
  (diagram S.arrows).map F₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₁
hF₂ :
  (diagram S.arrows).map F₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ } =
    s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₂
this : ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y), f.left ≫ s.ι.app Y = s.ι.app X_1
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
hgf₁ : S.arrows (g₁ ≫ f₁)
hgf₂ : S.arrows (g₂ ≫ f₂)
F : Over.mk (g₁ ≫ f₁) ⟶ Over.mk (g₂ ≫ f₂) := Over.homMk (𝟙 Z)
F₁ : Over.mk (g₁ ≫ f₁) ⟶ Over.mk f₁ := Over.homMk g₁
F₂ : Over.mk (g₂ ≫ f₂) ⟶ Over.mk f₂ := Over.homMk g₂
hF :
  (diagram S.arrows).map F ≫ s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F
hF₁ :
  (diagram S.arrows).map F₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } =
    s.ι.app { obj := Over.mk (g₁ ≫ f₁), property := hgf₁ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₁
hF₂ :
  (diagram S.arrows).map F₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ } =
    s.ι.app { obj := Over.mk (g₂ ≫ f₂), property := hgf₂ } ≫
      ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map F₂
this : ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y), f.left ≫ s.ι.app Y = s.ι.app X_1
⊢ g₁ ≫ s.ι.app { obj := Over.mk f₁, property := hf₁ } = g₂ ≫ s.ι.app { obj := Over.mk f₂, property := hf₂ }
Tactic:
aesop_cat
State after:
no goals

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
⊢ S.arrows (g₁ ≫ f₁)
Tactic:
exact Sieve.downward_closed S hf₁ g₁
State after:
no goals

State before:
C : Type u
inst✝¹ : Category C
inst✝ : Precoherent C
X : C
S : Sieve X
s : Cocone (diagram S.arrows)
Y₁ Y₂ Z : C
g₁ : Z ⟶ Y₁
g₂ : Z ⟶ Y₂
f₁ : Y₁ ⟶ X
f₂ : Y₂ ⟶ X
hf₁ : S.arrows f₁
hf₂ : S.arrows f₂
hgf : g₁ ≫ f₁ = g₂ ≫ f₂
this :
  ∀ ⦃X_1 Y : FullSubcategory fun f => S.arrows f.hom⦄ (f : X_1 ⟶ Y),
    (diagram S.arrows).map f ≫ s.ι.app Y =
      s.ι.app X_1 ≫ ((Functor.const (FullSubcategory fun f => S.arrows f.hom)).obj s.pt).map f
hgf₁ : S.arrows (g₁ ≫ f₁)
⊢ S.arrows (g₂ ≫ f₂)
Tactic:
exact Sieve.downward_closed S hf₂ g₂
State after:
no goals