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

tactic: ext x
state_before: J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
⊢ Set.range ⇑(prod.lift pullback.fst pullback.snd) = {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x}
state_after: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
⊢ x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd) ↔ x ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x}

tactic: constructor
state_before: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
⊢ x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd) ↔ x ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x}
state_after: case h.mp
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
⊢ x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd) → x ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x}

case h.mpr
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
⊢ x ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x} → x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd)

tactic: rintro ⟨y, rfl⟩
state_before: case h.mp
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
⊢ x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd) → x ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x}
state_after: case h.mp.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
y : ↑(pullback f g)
⊢ (prod.lift pullback.fst pullback.snd) y ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x}

tactic: change (_ ≫ _ ≫ f) _ = (_ ≫ _ ≫ g) _
state_before: case h.mp.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
y : ↑(pullback f g)
⊢ (prod.lift pullback.fst pullback.snd) y ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x}
state_after: case h.mp.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
y : ↑(pullback f g)
⊢ (prod.lift pullback.fst pullback.snd ≫ prod.fst ≫ f) y = (prod.lift pullback.fst pullback.snd ≫ prod.snd ≫ g) y

tactic: simp [pullback.condition]
state_before: case h.mp.intro
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
y : ↑(pullback f g)
⊢ (prod.lift pullback.fst pullback.snd ≫ prod.fst ≫ f) y = (prod.lift pullback.fst pullback.snd ≫ prod.snd ≫ g) y
state_after: no goals

tactic: rintro (h : f (_, _).1 = g (_, _).2)
state_before: case h.mpr
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
⊢ x ∈ {x | (prod.fst ≫ f) x = (prod.snd ≫ g) x} → x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd)
state_after: case h.mpr
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, ?m.71688).1 = g (?m.71749, prod.snd x).2
⊢ x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd)

tactic: use (pullbackIsoProdSubtype f g).inv ⟨⟨_, _⟩, h⟩
state_before: case h.mpr
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, ?m.71688).1 = g (?m.71749, prod.snd x).2
⊢ x ∈ Set.range ⇑(prod.lift pullback.fst pullback.snd)
state_after: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, prod.snd x).1 = g (prod.fst x, prod.snd x).2
⊢ (prod.lift pullback.fst pullback.snd) ((pullbackIsoProdSubtype f g).inv ⟨(prod.fst x, prod.snd x), h⟩) = x

tactic: change (forget TopCat).map _ _ = _
state_before: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, prod.snd x).1 = g (prod.fst x, prod.snd x).2
⊢ (prod.lift pullback.fst pullback.snd) ((pullbackIsoProdSubtype f g).inv ⟨(prod.fst x, prod.snd x), h⟩) = x
state_after: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, prod.snd x).1 = g (prod.fst x, prod.snd x).2
⊢ (forget TopCat).map (prod.lift pullback.fst pullback.snd)
      ((pullbackIsoProdSubtype f g).inv ⟨(prod.fst x, prod.snd x), h⟩) =
    x

tactic: apply Concrete.limit_ext
state_before: case h
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, prod.snd x).1 = g (prod.fst x, prod.snd x).2
⊢ (forget TopCat).map (prod.lift pullback.fst pullback.snd)
      ((pullbackIsoProdSubtype f g).inv ⟨(prod.fst x, prod.snd x), h⟩) =
    x
state_after: case h.a
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, prod.snd x).1 = g (prod.fst x, prod.snd x).2
⊢ ∀ (j : Discrete WalkingPair),
    (limit.π (pair X Y) j)
        ((forget TopCat).map (prod.lift pullback.fst pullback.snd)
          ((pullbackIsoProdSubtype f g).inv ⟨(prod.fst x, prod.snd x), h⟩)) =
      (limit.π (pair X Y) j) x

tactic: rintro ⟨⟨⟩⟩ <;>
erw [← comp_apply, ← comp_apply, limit.lift_π] <;> aesop_cat
state_before: case h.a
J : Type v
inst✝ : SmallCategory J
X✝ Y✝ Z✝ : TopCat
X Y Z : TopCat
f : X ⟶ Z
g : Y ⟶ Z
x : ↑(X ⨯ Y)
h : f (prod.fst x, prod.snd x).1 = g (prod.fst x, prod.snd x).2
⊢ ∀ (j : Discrete WalkingPair),
    (limit.π (pair X Y) j)
        ((forget TopCat).map (prod.lift pullback.fst pullback.snd)
          ((pullbackIsoProdSubtype f g).inv ⟨(prod.fst x, prod.snd x), h⟩)) =
      (limit.π (pair X Y) j) x
state_after: no goals