Theorem: AlgebraicGeometry.Scheme.GlueData.oneHypercover_I₀
File: Mathlib/AlgebraicGeometry/GluingOneHypercover.lean

Proof steps:
state_before: D : GlueData
i₁ i₂ : D.J
x✝ : (fun x x => PUnit.{u + 1}) i₁ i₂
⊢ (fun i₁ i₂ x => D.f i₁ i₂) i₁ i₂ x✝ ≫ D.ι i₁ = (fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁) i₁ i₂ x✝ ≫ D.ι i₂
state_after: no goals
tactic: simp only [Category.assoc, Scheme.GlueData.glue_condition]
state_before: D : GlueData
⊢ { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
        p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₀ ∈
    zariskiTopology.sieves D.glued
state_after: D : GlueData
⊢ Sieve.generate (Presieve.ofArrows D.openCover.obj D.openCover.map) ≤
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
        p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₀
tactic: refine zariskiTopology.superset_covering ?_ (zariskiTopology_openCover D.openCover)
state_before: D : GlueData
⊢ Sieve.generate (Presieve.ofArrows D.openCover.obj D.openCover.map) ≤
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
        p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₀
state_after: D : GlueData
⊢ Presieve.ofArrows D.openCover.obj D.openCover.map ≤
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₀.arrows
tactic: rw [Sieve.generate_le_iff]
state_before: D : GlueData
⊢ Presieve.ofArrows D.openCover.obj D.openCover.map ≤
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₀.arrows
state_after: case mk
D : GlueData
Y : Scheme
i : D.openCover.J
⊢ D.openCover.map i ∈
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₀.arrows
tactic: rintro W _ ⟨i⟩
state_before: case mk
D : GlueData
Y : Scheme
i : D.openCover.J
⊢ D.openCover.map i ∈
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₀.arrows
state_after: no goals
tactic: exact ⟨_, 𝟙 _, _, ⟨i⟩, by simp; rfl⟩
state_before: D : GlueData
i₁ i₂ :
  { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
      p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.I₀
W : Scheme
p₁ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₁
p₂ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₂
fac :
  p₁ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₁ =
    p₂ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₂
⊢ { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₁
      p₁ p₂ ∈
    zariskiTopology.sieves W
state_after: D : GlueData
i₁ i₂ :
  { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
      p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.I₀
W : Scheme
p₁ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₁
p₂ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₂
fac :
  p₁ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₁ =
    p₂ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₂
T : Scheme
g : T ⟶ W
x✝ : ⊤.arrows g
⊢ ({ I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₁
        p₁ p₂).arrows
    g
tactic: refine zariskiTopology.superset_covering (fun T g _ ↦ ?_) (zariskiTopology.top_mem _)
state_before: D : GlueData
i₁ i₂ :
  { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
      p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.I₀
W : Scheme
p₁ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₁
p₂ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₂
fac :
  p₁ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₁ =
    p₂ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₂
T : Scheme
g : T ⟶ W
x✝ : ⊤.arrows g
⊢ ({ I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₁
        p₁ p₂).arrows
    g
state_after: D : GlueData
i₁ i₂ :
  { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
      p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.I₀
W : Scheme
p₁ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₁
p₂ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₂
fac :
  p₁ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₁ =
    p₂ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₂
T : Scheme
g : T ⟶ W
x✝ : ⊤.arrows g
φ : T ⟶ (D.vPullbackCone i₁ i₂).pt
h₁ : φ ≫ (D.vPullbackCone i₁ i₂).fst = g ≫ p₁
h₂ : φ ≫ (D.vPullbackCone i₁ i₂).snd = g ≫ p₂
⊢ ({ I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₁
        p₁ p₂).arrows
    g
tactic: have ⟨φ, h₁, h₂⟩ := PullbackCone.IsLimit.lift' (D.vPullbackConeIsLimit i₁ i₂)
      (g ≫ p₁) (g ≫ p₂) (by simpa using g ≫= fac)
state_before: D : GlueData
i₁ i₂ :
  { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
      p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.I₀
W : Scheme
p₁ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₁
p₂ :
  W ⟶
    { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
          p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.X
      i₂
fac :
  p₁ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₁ =
    p₂ ≫
      { I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.f
        i₂
T : Scheme
g : T ⟶ W
x✝ : ⊤.arrows g
φ : T ⟶ (D.vPullbackCone i₁ i₂).pt
h₁ : φ ≫ (D.vPullbackCone i₁ i₂).fst = g ≫ p₁
h₂ : φ ≫ (D.vPullbackCone i₁ i₂).snd = g ≫ p₂
⊢ ({ I₀ := D.J, X := D.U, f := D.ι, I₁ := fun x x => PUnit.{u + 1}, Y := fun i₁ i₂ x => D.V (i₁, i₂),
            p₁ := fun i₁ i₂ x => D.f i₁ i₂, p₂ := fun i₁ i₂ j => D.t i₁ i₂ ≫ D.f i₂ i₁, w := ⋯ }.sieve₁
        p₁ p₂).arrows
    g
state_after: no goals
tactic: exact ⟨⟨⟩, φ, h₁.symm, h₂.symm⟩