Theorem: TopCat.range_pullback_map
File: Mathlib/Topology/Category/TopCat/Limits/Pullbacks.lean

Proof steps:
state_before: J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
⊢ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂) =
    ⇑(pullback.fst g₁ g₂) ⁻¹' Set.range ⇑i₁ ∩ ⇑(pullback.snd g₁ g₂) ⁻¹' Set.range ⇑i₂
state_after: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
⊢ x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂) ↔
    x✝ ∈ ⇑(pullback.fst g₁ g₂) ⁻¹' Set.range ⇑i₁ ∩ ⇑(pullback.snd g₁ g₂) ⁻¹' Set.range ⇑i₂
tactic: ext
state_before: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
⊢ x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂) ↔
    x✝ ∈ ⇑(pullback.fst g₁ g₂) ⁻¹' Set.range ⇑i₁ ∩ ⇑(pullback.snd g₁ g₂) ⁻¹' Set.range ⇑i₂
state_after: case h.mp
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
⊢ x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂) →
    x✝ ∈ ⇑(pullback.fst g₁ g₂) ⁻¹' Set.range ⇑i₁ ∩ ⇑(pullback.snd g₁ g₂) ⁻¹' Set.range ⇑i₂

case h.mpr
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
⊢ x✝ ∈ ⇑(pullback.fst g₁ g₂) ⁻¹' Set.range ⇑i₁ ∩ ⇑(pullback.snd g₁ g₂) ⁻¹' Set.range ⇑i₂ →
    x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
tactic: constructor
state_before: case h.mpr
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
⊢ x✝ ∈ ⇑(pullback.fst g₁ g₂) ⁻¹' Set.range ⇑i₁ ∩ ⇑(pullback.snd g₁ g₂) ⁻¹' Set.range ⇑i₂ →
    x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
state_after: case h.mpr.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
⊢ x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
tactic: rintro ⟨⟨x₁, hx₁⟩, ⟨x₂, hx₂⟩⟩
state_before: case h.mpr.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
⊢ x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
state_after: case h.mpr.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
tactic: have : f₁ x₁ = f₂ x₂ := by
    apply (TopCat.mono_iff_injective _).mp H₃
    erw [← comp_apply, eq₁, ← comp_apply, eq₂, -- now `erw` after #13170
      comp_apply, comp_apply, hx₁, hx₂, ← comp_apply, pullback.condition]
    rfl
state_before: case h.mpr.intro.intro.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ x✝ ∈ Set.range ⇑(pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
state_after: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ (pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂) ((pullbackIsoProdSubtype f₁ f₂).inv ⟨(x₁, x₂), this⟩) = x✝
tactic: use (pullbackIsoProdSubtype f₁ f₂).inv ⟨⟨x₁, x₂⟩, this⟩
state_before: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ (pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂) ((pullbackIsoProdSubtype f₁ f₂).inv ⟨(x₁, x₂), this⟩) = x✝
state_after: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ (forget TopCat).map (pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
      ((pullbackIsoProdSubtype f₁ f₂).inv ⟨(x₁, x₂), this⟩) =
    x✝
tactic: change (forget TopCat).map _ _ = _
state_before: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ (forget TopCat).map (pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
      ((pullbackIsoProdSubtype f₁ f₂).inv ⟨(x₁, x₂), this⟩) =
    x✝
state_after: case h.a
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ ∀ (j : WalkingCospan),
    (limit.π (cospan g₁ g₂) j)
        ((forget TopCat).map (pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
          ((pullbackIsoProdSubtype f₁ f₂).inv ⟨(x₁, x₂), this⟩)) =
      (limit.π (cospan g₁ g₂) j) x✝
tactic: apply Concrete.limit_ext
state_before: case h.a
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ ∀ (j : WalkingCospan),
    (limit.π (cospan g₁ g₂) j)
        ((forget TopCat).map (pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂)
          ((pullbackIsoProdSubtype f₁ f₂).inv ⟨(x₁, x₂), this⟩)) =
      (limit.π (cospan g₁ g₂) j) x✝
state_after: case h.a.none
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ ((pullbackIsoProdSubtype f₁ f₂).inv ≫ pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂ ≫ limit.π (cospan g₁ g₂) none)
      ⟨(x₁, x₂), this⟩ =
    (limit.π (cospan g₁ g₂) none) x✝

case h.a.some.left
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ ((pullbackIsoProdSubtype f₁ f₂).inv ≫
        pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂ ≫ limit.π (cospan g₁ g₂) (some WalkingPair.left))
      ⟨(x₁, x₂), this⟩ =
    (limit.π (cospan g₁ g₂) (some WalkingPair.left)) x✝

case h.a.some.right
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
W X Y Z S T : TopCat
f₁ : W ⟶ S
f₂ : X ⟶ S
g₁ : Y ⟶ T
g₂ : Z ⟶ T
i₁ : W ⟶ Y
i₂ : X ⟶ Z
i₃ : S ⟶ T
H₃ : Mono i₃
eq₁ : f₁ ≫ i₃ = i₁ ≫ g₁
eq₂ : f₂ ≫ i₃ = i₂ ≫ g₂
x✝ : ↑(pullback g₁ g₂)
x₁ : ↑W
hx₁ : i₁ x₁ = (pullback.fst g₁ g₂) x✝
x₂ : ↑X
hx₂ : i₂ x₂ = (pullback.snd g₁ g₂) x✝
this : f₁ x₁ = f₂ x₂
⊢ ((pullbackIsoProdSubtype f₁ f₂).inv ≫
        pullback.map f₁ f₂ g₁ g₂ i₁ i₂ i₃ eq₁ eq₂ ≫ limit.π (cospan g₁ g₂) (some WalkingPair.right))
      ⟨(x₁, x₂), this⟩ =
    (limit.π (cospan g₁ g₂) (some WalkingPair.right)) x✝
tactic: rintro (_ | _ | _) <;>
  erw [← comp_apply, ← comp_apply]