Theorem: AlgebraicGeometry.Scheme.Pullback.openCoverOfBase'_map
File: Mathlib/AlgebraicGeometry/Pullbacks.lean

Proof steps:
state_before: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
⊢ (pullback f g).OpenCover
state_after: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
⊢ (x : (openCoverOfLeft (𝒰.pullbackCover f) f g).J) → ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj x).OpenCover
tactic: apply (openCoverOfLeft (𝒰.pullbackCover f) f g).bind
state_before: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
⊢ (x : (openCoverOfLeft (𝒰.pullbackCover f) f g).J) → ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj x).OpenCover
state_after: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
tactic: intro i
state_before: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
state_after: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
tactic: let Xᵢ := pullback f (𝒰.map i)
state_before: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
state_after: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
tactic: let Yᵢ := pullback g (𝒰.map i)
state_before: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
state_after: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
W : Scheme := pullback (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i))
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
tactic: let W := pullback (pullback.snd _ _ : Yᵢ ⟶ _) (pullback.snd _ _ : Xᵢ ⟶ _)
state_before: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
W : Scheme := pullback (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i))
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
state_after: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
W : Scheme := pullback (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i))
this :
  IsLimit
    (PullbackCone.mk (pullback.snd (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)))
      (pullback.fst (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)) ≫ pullback.fst g (𝒰.map i)) ⋯)
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
tactic: have :=
    bigSquareIsPullback (pullback.fst _ _ : W ⟶ _) (pullback.fst _ _ : Yᵢ ⟶ _)
      (pullback.snd _ _ : Xᵢ ⟶ _) (𝒰.map i) (pullback.snd _ _) (pullback.snd _ _) g
      pullback.condition.symm pullback.condition.symm
      (PullbackCone.isLimitOfFlip <| pullbackIsPullback _ _)
      (PullbackCone.isLimitOfFlip <| pullbackIsPullback _ _)
state_before: C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
W : Scheme := pullback (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i))
this :
  IsLimit
    (PullbackCone.mk (pullback.snd (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)))
      (pullback.fst (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)) ≫ pullback.fst g (𝒰.map i)) ⋯)
⊢ ((openCoverOfLeft (𝒰.pullbackCover f) f g).obj i).OpenCover
state_after: case refine_1
C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
W : Scheme := pullback (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i))
this :
  IsLimit
    (PullbackCone.mk (pullback.snd (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)))
      (pullback.fst (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)) ≫ pullback.fst g (𝒰.map i)) ⋯)
⊢ (pullback.snd f (𝒰.map i) ≫ 𝒰.map i) ≫ 𝟙 Z = 𝟙 (pullback f (𝒰.map i)) ≫ (𝒰.pullbackCover f).map i ≫ f

case refine_2
C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
W : Scheme := pullback (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i))
this :
  IsLimit
    (PullbackCone.mk (pullback.snd (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)))
      (pullback.fst (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)) ≫ pullback.fst g (𝒰.map i)) ⋯)
⊢ g ≫ 𝟙 Z = 𝟙 Y ≫ g

case refine_3
C : Type u
inst✝¹ : Category.{v, u} C
X Y Z : Scheme
𝒰✝ : X.OpenCover
f✝ : X ⟶ Z
g✝ : Y ⟶ Z
inst✝ : ∀ (i : 𝒰✝.J), HasPullback (𝒰✝.map i ≫ f✝) g✝
s : PullbackCone f✝ g✝
𝒰 : Z.OpenCover
f : X ⟶ Z
g : Y ⟶ Z
i : (openCoverOfLeft (𝒰.pullbackCover f) f g).J
Xᵢ : Scheme := pullback f (𝒰.map i)
Yᵢ : Scheme := pullback g (𝒰.map i)
W : Scheme := pullback (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i))
this :
  IsLimit
    (PullbackCone.mk (pullback.snd (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)))
      (pullback.fst (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)) ≫ pullback.fst g (𝒰.map i)) ⋯)
⊢ IsIso
    ((pullbackSymmetry (pullback.snd f (𝒰.map i)) (pullback.snd g (𝒰.map i))).hom ≫
      (limit.isoLimitCone
            {
              cone :=
                PullbackCone.mk (pullback.snd (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)))
                  (pullback.fst (pullback.snd g (𝒰.map i)) (pullback.snd f (𝒰.map i)) ≫ pullback.fst g (𝒰.map i)) ⋯,
              isLimit := this }).inv ≫
        pullback.map (pullback.snd f (𝒰.map i) ≫ 𝒰.map i) g ((𝒰.pullbackCover f).map i ≫ f) g (𝟙 (pullback f (𝒰.map i)))
          (𝟙 Y) (𝟙 Z) ?refine_1 ?refine_2)
tactic: refine
    @openCoverOfIsIso
      (f := (pullbackSymmetry _ _).hom ≫ (limit.isoLimitCone ⟨_, this⟩).inv ≫
        pullback.map _ _ _ _ (𝟙 _) (𝟙 _) (𝟙 _) ?_ ?_) ?_