[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a : R
s : Finset α
p : α → R
hp : ∀ (i : α), i ∈ s → Prime (p i)
hx : x * y = a * ∏ i in s, p i
⊢ ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
[PROOFSTEP]
induction' s using Finset.induction with i s his ih generalizing x y a
[GOAL]
case empty
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x✝ y✝ a✝ : R
s : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s → Prime (p i)
hx✝ : x✝ * y✝ = a✝ * ∏ i in s, p i
x y a : R
hp : ∀ (i : α), i ∈ ∅ → Prime (p i)
hx : x * y = a * ∏ i in ∅, p i
⊢ ∃ t u b c, t ∪ u = ∅ ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
[PROOFSTEP]
exact ⟨∅, ∅, x, y, by simp [hx]⟩
[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x✝ y✝ a✝ : R
s : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s → Prime (p i)
hx✝ : x✝ * y✝ = a✝ * ∏ i in s, p i
x y a : R
hp : ∀ (i : α), i ∈ ∅ → Prime (p i)
hx : x * y = a * ∏ i in ∅, p i
⊢ ∅ ∪ ∅ = ∅ ∧ Disjoint ∅ ∅ ∧ a = x * y ∧ x = x * ∏ i in ∅, p i ∧ y = y * ∏ i in ∅, p i
[PROOFSTEP]
simp [hx]
[GOAL]
case insert
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x✝ y✝ a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x✝ * y✝ = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
x y a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hx : x * y = a * ∏ i in insert i s, p i
⊢ ∃ t u b c, t ∪ u = insert i s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
[PROOFSTEP]
rw [prod_insert his, ← mul_assoc] at hx
[GOAL]
case insert
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x✝ y✝ a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x✝ * y✝ = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
x y a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hx : x * y = a * p i * ∏ x in s, p x
⊢ ∃ t u b c, t ∪ u = insert i s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
[PROOFSTEP]
have hpi : Prime (p i) := hp i (mem_insert_self _ _)
[GOAL]
case insert
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x✝ y✝ a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x✝ * y✝ = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
x y a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hx : x * y = a * p i * ∏ x in s, p x
hpi : Prime (p i)
⊢ ∃ t u b c, t ∪ u = insert i s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
[PROOFSTEP]
rcases ih (fun i hi ↦ hp i (mem_insert_of_mem hi)) hx with ⟨t, u, b, c, htus, htu, hbc, rfl, rfl⟩
[GOAL]
case insert.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b c : R
htus : t ∪ u = s
htu : Disjoint t u
hbc : a * p i = b * c
hx : (b * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ ∃ t_1 u_1 b_1 c_1,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b_1 * c_1 ∧ b * ∏ i in t, p i = b_1 * ∏ i in t_1, p i ∧ c * ∏ i in u, p i = c_1 * ∏ i in u_1, p i
[PROOFSTEP]
have hit : i ∉ t := fun hit ↦ his (htus ▸ mem_union_left _ hit)
[GOAL]
case insert.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b c : R
htus : t ∪ u = s
htu : Disjoint t u
hbc : a * p i = b * c
hx : (b * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
hit : ¬i ∈ t
⊢ ∃ t_1 u_1 b_1 c_1,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b_1 * c_1 ∧ b * ∏ i in t, p i = b_1 * ∏ i in t_1, p i ∧ c * ∏ i in u, p i = c_1 * ∏ i in u_1, p i
[PROOFSTEP]
have hiu : i ∉ u := fun hiu ↦ his (htus ▸ mem_union_right _ hiu)
[GOAL]
case insert.intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b c : R
htus : t ∪ u = s
htu : Disjoint t u
hbc : a * p i = b * c
hx : (b * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
hit : ¬i ∈ t
hiu : ¬i ∈ u
⊢ ∃ t_1 u_1 b_1 c_1,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b_1 * c_1 ∧ b * ∏ i in t, p i = b_1 * ∏ i in t_1, p i ∧ c * ∏ i in u, p i = c_1 * ∏ i in u_1, p i
[PROOFSTEP]
obtain ⟨d, rfl⟩ | ⟨d, rfl⟩ : p i ∣ b ∨ p i ∣ c
[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b c : R
htus : t ∪ u = s
htu : Disjoint t u
hbc : a * p i = b * c
hx : (b * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
hit : ¬i ∈ t
hiu : ¬i ∈ u
⊢ p i ∣ b ∨ p i ∣ c
case insert.intro.intro.intro.intro.intro.intro.intro.intro.inl.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
c : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a * p i = p i * d * c
hx : (p i * d * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ ∃ t_1 u_1 b c_1,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b * c_1 ∧ p i * d * ∏ i in t, p i = b * ∏ i in t_1, p i ∧ c * ∏ i in u, p i = c_1 * ∏ i in u_1, p i
case insert.intro.intro.intro.intro.intro.intro.intro.intro.inr.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a * p i = b * (p i * d)
hx : (b * ∏ i in t, p i) * (p i * d * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ ∃ t_1 u_1 b_1 c,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b_1 * c ∧ b * ∏ i in t, p i = b_1 * ∏ i in t_1, p i ∧ p i * d * ∏ i in u, p i = c * ∏ i in u_1, p i
[PROOFSTEP]
exact hpi.dvd_or_dvd ⟨a, by rw [← hbc, mul_comm]⟩
[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b c : R
htus : t ∪ u = s
htu : Disjoint t u
hbc : a * p i = b * c
hx : (b * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
hit : ¬i ∈ t
hiu : ¬i ∈ u
⊢ b * c = p i * a
[PROOFSTEP]
rw [← hbc, mul_comm]
[GOAL]
case insert.intro.intro.intro.intro.intro.intro.intro.intro.inl.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
c : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a * p i = p i * d * c
hx : (p i * d * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ ∃ t_1 u_1 b c_1,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b * c_1 ∧ p i * d * ∏ i in t, p i = b * ∏ i in t_1, p i ∧ c * ∏ i in u, p i = c_1 * ∏ i in u_1, p i
[PROOFSTEP]
rw [mul_assoc, mul_comm a, mul_right_inj' hpi.ne_zero] at hbc
[GOAL]
case insert.intro.intro.intro.intro.intro.intro.intro.intro.inl.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
c : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a = d * c
hx : (p i * d * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ ∃ t_1 u_1 b c_1,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b * c_1 ∧ p i * d * ∏ i in t, p i = b * ∏ i in t_1, p i ∧ c * ∏ i in u, p i = c_1 * ∏ i in u_1, p i
[PROOFSTEP]
exact
  ⟨insert i t, u, d, c, by rw [insert_union, htus], disjoint_insert_left.2 ⟨hiu, htu⟩, by
    simp [hbc, prod_insert hit, mul_assoc, mul_comm, mul_left_comm]⟩
[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
c : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a = d * c
hx : (p i * d * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ insert i t ∪ u = insert i s
[PROOFSTEP]
rw [insert_union, htus]
[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
c : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a = d * c
hx : (p i * d * ∏ i in t, p i) * (c * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ a = d * c ∧ p i * d * ∏ i in t, p i = d * ∏ i in insert i t, p i ∧ c * ∏ i in u, p i = c * ∏ i in u, p i
[PROOFSTEP]
simp [hbc, prod_insert hit, mul_assoc, mul_comm, mul_left_comm]
[GOAL]
case insert.intro.intro.intro.intro.intro.intro.intro.intro.inr.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a * p i = b * (p i * d)
hx : (b * ∏ i in t, p i) * (p i * d * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ ∃ t_1 u_1 b_1 c,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b_1 * c ∧ b * ∏ i in t, p i = b_1 * ∏ i in t_1, p i ∧ p i * d * ∏ i in u, p i = c * ∏ i in u_1, p i
[PROOFSTEP]
rw [← mul_assoc, mul_right_comm b, mul_left_inj' hpi.ne_zero] at hbc
[GOAL]
case insert.intro.intro.intro.intro.intro.intro.intro.intro.inr.intro
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a = b * d
hx : (b * ∏ i in t, p i) * (p i * d * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ ∃ t_1 u_1 b_1 c,
    t_1 ∪ u_1 = insert i s ∧
      Disjoint t_1 u_1 ∧
        a = b_1 * c ∧ b * ∏ i in t, p i = b_1 * ∏ i in t_1, p i ∧ p i * d * ∏ i in u, p i = c * ∏ i in u_1, p i
[PROOFSTEP]
exact
  ⟨t, insert i u, b, d, by rw [union_insert, htus], disjoint_insert_right.2 ⟨hit, htu⟩, by
    simp [← hbc, prod_insert hiu, mul_assoc, mul_comm, mul_left_comm]⟩
[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a = b * d
hx : (b * ∏ i in t, p i) * (p i * d * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ t ∪ insert i u = insert i s
[PROOFSTEP]
rw [union_insert, htus]
[GOAL]
R : Type u_1
inst✝¹ : CancelCommMonoidWithZero R
α : Type u_2
inst✝ : DecidableEq α
x y a✝ : R
s✝ : Finset α
p : α → R
hp✝ : ∀ (i : α), i ∈ s✝ → Prime (p i)
hx✝ : x * y = a✝ * ∏ i in s✝, p i
i : α
s : Finset α
his : ¬i ∈ s
ih :
  ∀ {x y a : R},
    (∀ (i : α), i ∈ s → Prime (p i)) →
      x * y = a * ∏ i in s, p i →
        ∃ t u b c, t ∪ u = s ∧ Disjoint t u ∧ a = b * c ∧ x = b * ∏ i in t, p i ∧ y = c * ∏ i in u, p i
a : R
hp : ∀ (i_1 : α), i_1 ∈ insert i s → Prime (p i_1)
hpi : Prime (p i)
t u : Finset α
b : R
htus : t ∪ u = s
htu : Disjoint t u
hit : ¬i ∈ t
hiu : ¬i ∈ u
d : R
hbc : a = b * d
hx : (b * ∏ i in t, p i) * (p i * d * ∏ i in u, p i) = a * p i * ∏ x in s, p x
⊢ a = b * d ∧ b * ∏ i in t, p i = b * ∏ i in t, p i ∧ p i * d * ∏ i in u, p i = d * ∏ i in insert i u, p i
[PROOFSTEP]
simp [← hbc, prod_insert hiu, mul_assoc, mul_comm, mul_left_comm]
[GOAL]
R : Type u_1
inst✝ : CancelCommMonoidWithZero R
x y a p : R
n : ℕ
hp : Prime p
hx : x * y = a * p ^ n
⊢ ∃ i j b c, i + j = n ∧ a = b * c ∧ x = b * p ^ i ∧ y = c * p ^ j
[PROOFSTEP]
rcases mul_eq_mul_prime_prod (fun _ _ ↦ hp) (show x * y = a * (range n).prod fun _ ↦ p by simpa) with
  ⟨t, u, b, c, htus, htu, rfl, rfl, rfl⟩
[GOAL]
R : Type u_1
inst✝ : CancelCommMonoidWithZero R
x y a p : R
n : ℕ
hp : Prime p
hx : x * y = a * p ^ n
⊢ x * y = a * ∏ x in range n, p
[PROOFSTEP]
simpa
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro
R : Type u_1
inst✝ : CancelCommMonoidWithZero R
p : R
n : ℕ
hp : Prime p
t u : Finset ℕ
b c : R
htus : t ∪ u = range n
htu : Disjoint t u
hx : (b * ∏ i in t, p) * (c * ∏ i in u, p) = b * c * p ^ n
⊢ ∃ i j b_1 c_1, i + j = n ∧ b * c = b_1 * c_1 ∧ b * ∏ i in t, p = b_1 * p ^ i ∧ c * ∏ i in u, p = c_1 * p ^ j
[PROOFSTEP]
exact ⟨t.card, u.card, b, c, by rw [← card_disjoint_union htu, htus, card_range], by simp⟩
[GOAL]
R : Type u_1
inst✝ : CancelCommMonoidWithZero R
p : R
n : ℕ
hp : Prime p
t u : Finset ℕ
b c : R
htus : t ∪ u = range n
htu : Disjoint t u
hx : (b * ∏ i in t, p) * (c * ∏ i in u, p) = b * c * p ^ n
⊢ card t + card u = n
[PROOFSTEP]
rw [← card_disjoint_union htu, htus, card_range]
[GOAL]
R : Type u_1
inst✝ : CancelCommMonoidWithZero R
p : R
n : ℕ
hp : Prime p
t u : Finset ℕ
b c : R
htus : t ∪ u = range n
htu : Disjoint t u
hx : (b * ∏ i in t, p) * (c * ∏ i in u, p) = b * c * p ^ n
⊢ b * c = b * c ∧ b * ∏ i in t, p = b * p ^ card t ∧ c * ∏ i in u, p = c * p ^ card u
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
inst✝ : CommRing α
p : α
hp : Prime p
⊢ Prime (-p)
[PROOFSTEP]
obtain ⟨h1, h2, h3⟩ := hp
[GOAL]
case intro.intro
α : Type u_1
inst✝ : CommRing α
p : α
h1 : p ≠ 0
h2 : ¬IsUnit p
h3 : ∀ (a b : α), p ∣ a * b → p ∣ a ∨ p ∣ b
⊢ Prime (-p)
[PROOFSTEP]
exact ⟨neg_ne_zero.mpr h1, by rwa [IsUnit.neg_iff], by simpa [neg_dvd] using h3⟩
[GOAL]
α : Type u_1
inst✝ : CommRing α
p : α
h1 : p ≠ 0
h2 : ¬IsUnit p
h3 : ∀ (a b : α), p ∣ a * b → p ∣ a ∨ p ∣ b
⊢ ¬IsUnit (-p)
[PROOFSTEP]
rwa [IsUnit.neg_iff]
[GOAL]
α : Type u_1
inst✝ : CommRing α
p : α
h1 : p ≠ 0
h2 : ¬IsUnit p
h3 : ∀ (a b : α), p ∣ a * b → p ∣ a ∨ p ∣ b
⊢ ∀ (a b : α), -p ∣ a * b → -p ∣ a ∨ -p ∣ b
[PROOFSTEP]
simpa [neg_dvd] using h3
[GOAL]
α : Type u_1
inst✝¹ : CommRing α
inst✝ : LinearOrder α
p : α
hp : Prime p
⊢ Prime |p|
[PROOFSTEP]
obtain h | h := abs_choice p
[GOAL]
case inl
α : Type u_1
inst✝¹ : CommRing α
inst✝ : LinearOrder α
p : α
hp : Prime p
h : |p| = p
⊢ Prime |p|
[PROOFSTEP]
rw [h]
[GOAL]
case inr
α : Type u_1
inst✝¹ : CommRing α
inst✝ : LinearOrder α
p : α
hp : Prime p
h : |p| = -p
⊢ Prime |p|
[PROOFSTEP]
rw [h]
[GOAL]
case inl
α : Type u_1
inst✝¹ : CommRing α
inst✝ : LinearOrder α
p : α
hp : Prime p
h : |p| = p
⊢ Prime p
[PROOFSTEP]
exact hp
[GOAL]
case inr
α : Type u_1
inst✝¹ : CommRing α
inst✝ : LinearOrder α
p : α
hp : Prime p
h : |p| = -p
⊢ Prime (-p)
[PROOFSTEP]
exact hp.neg


[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
⊢ IsIso f
[PROOFSTEP]
let E := Equiv.ofBijective _ bij
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
⊢ IsIso f
[PROOFSTEP]
have hE : Continuous E.symm := by
  rw [continuous_iff_isClosed]
  intro S hS
  rw [← E.image_eq_preimage]
  exact isClosedMap f S hS
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
⊢ Continuous ↑E.symm
[PROOFSTEP]
rw [continuous_iff_isClosed]
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
⊢ ∀ (s : Set ((forget CompHaus).obj X)), IsClosed s → IsClosed (↑E.symm ⁻¹' s)
[PROOFSTEP]
intro S hS
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
S : Set ((forget CompHaus).obj X)
hS : IsClosed S
⊢ IsClosed (↑E.symm ⁻¹' S)
[PROOFSTEP]
rw [← E.image_eq_preimage]
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
S : Set ((forget CompHaus).obj X)
hS : IsClosed S
⊢ IsClosed (↑E '' S)
[PROOFSTEP]
exact isClosedMap f S hS
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
⊢ IsIso f
[PROOFSTEP]
refine' ⟨⟨⟨E.symm, hE⟩, _, _⟩⟩
[GOAL]
case refine'_1
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
⊢ f ≫ ContinuousMap.mk ↑E.symm = 𝟙 X
[PROOFSTEP]
ext x
[GOAL]
case refine'_1.w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
x : (forget CompHaus).obj X
⊢ ↑(f ≫ ContinuousMap.mk ↑E.symm) x = ↑(𝟙 X) x
[PROOFSTEP]
apply E.symm_apply_apply
[GOAL]
case refine'_2
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
⊢ ContinuousMap.mk ↑E.symm ≫ f = 𝟙 Y
[PROOFSTEP]
ext x
[GOAL]
case refine'_2.w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ⟶ Y
bij : Function.Bijective ↑f
E : (forget CompHaus).obj X ≃ (forget CompHaus).obj Y := Equiv.ofBijective (↑f) bij
hE : Continuous ↑E.symm
x : (forget CompHaus).obj Y
⊢ ↑(ContinuousMap.mk ↑E.symm ≫ f) x = ↑(𝟙 Y) x
[PROOFSTEP]
apply E.apply_symm_apply
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
⊢ ContinuousMap.mk ↑f ≫ ContinuousMap.mk ↑(Homeomorph.symm f) = 𝟙 X
[PROOFSTEP]
ext x
[GOAL]
case w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
x : (forget CompHaus).obj X
⊢ ↑(ContinuousMap.mk ↑f ≫ ContinuousMap.mk ↑(Homeomorph.symm f)) x = ↑(𝟙 X) x
[PROOFSTEP]
exact f.symm_apply_apply x
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
⊢ ContinuousMap.mk ↑(Homeomorph.symm f) ≫ ContinuousMap.mk ↑f = 𝟙 Y
[PROOFSTEP]
ext x
[GOAL]
case w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
x : (forget CompHaus).obj Y
⊢ ↑(ContinuousMap.mk ↑(Homeomorph.symm f) ≫ ContinuousMap.mk ↑f) x = ↑(𝟙 Y) x
[PROOFSTEP]
exact f.apply_symm_apply x
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
x : ↑X.toTop
⊢ ↑f.inv (↑f.hom x) = x
[PROOFSTEP]
simp
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
x : ↑Y.toTop
⊢ ↑f.hom (↑f.inv x) = x
[PROOFSTEP]
simp
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
⊢ isoOfHomeo (homeoOfIso f) = f
[PROOFSTEP]
ext
[GOAL]
case w.w
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : X ≅ Y
x✝ : (forget CompHaus).obj X
⊢ ↑(isoOfHomeo (homeoOfIso f)).hom x✝ = ↑f.hom x✝
[PROOFSTEP]
rfl
[GOAL]
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
⊢ homeoOfIso (isoOfHomeo f) = f
[PROOFSTEP]
ext
[GOAL]
case H
X✝ : Type u_1
inst✝² : TopologicalSpace X✝
inst✝¹ : CompactSpace X✝
inst✝ : T2Space X✝
X Y : CompHaus
f : ↑X.toTop ≃ₜ ↑Y.toTop
x✝ : ↑X.toTop
⊢ ↑(homeoOfIso (isoOfHomeo f)) x✝ = ↑f x✝
[PROOFSTEP]
rfl
[GOAL]
⊢ ∀ {A B : CompHaus} (f : A ⟶ B) [inst : IsIso ((forget CompHaus).map f)], IsIso f
[PROOFSTEP]
intro A B f hf
[GOAL]
A B : CompHaus
f : A ⟶ B
hf : IsIso ((forget CompHaus).map f)
⊢ IsIso f
[PROOFSTEP]
exact CompHaus.isIso_of_bijective _ ((isIso_iff_bijective f).mp hf)
[GOAL]
X : TopCat
Y : CompHaus
⊢ Function.LeftInverse (fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) fun f =>
    ContinuousMap.mk (↑f ∘ stoneCechUnit)
[PROOFSTEP]
rintro
  ⟨f : StoneCech X ⟶ Y, hf : Continuous f⟩
      -- Porting note: `ext` fails.
[GOAL]
case mk
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ (fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
      ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)) =
    ContinuousMap.mk f
[PROOFSTEP]
apply ContinuousMap.ext
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ ∀ (a : ↑(stoneCechObj X).toTop),
    ↑((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
            ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)))
        a =
      ↑(ContinuousMap.mk f) a
[PROOFSTEP]
intro (x : StoneCech X)
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ ↑((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
          ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)))
      x =
    ↑(ContinuousMap.mk f) x
[PROOFSTEP]
refine' congr_fun _ x
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ ↑((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun)))
        ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f))) =
    ↑(ContinuousMap.mk f)
[PROOFSTEP]
apply Continuous.ext_on denseRange_stoneCechUnit (continuous_stoneCechExtend _) hf
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Set.EqOn (stoneCechExtend ?m.48961) f (Set.range stoneCechUnit)
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Continuous ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)).toFun
[PROOFSTEP]
rintro _ ⟨y, rfl⟩
[GOAL]
case mk.h.intro
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
y : ↑X
⊢ stoneCechExtend ?m.48961 (stoneCechUnit y) = f (stoneCechUnit y)
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Continuous ((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit)) (ContinuousMap.mk f)).toFun
[PROOFSTEP]
apply congr_fun (stoneCechExtend_extends (hf.comp _)) y
[GOAL]
X : TopCat
Y : CompHaus
f : StoneCech ↑X ⟶ ↑Y.toTop
hf : Continuous f
x : StoneCech ↑X
⊢ Continuous fun x => stoneCechUnit x
[PROOFSTEP]
apply continuous_stoneCechUnit
[GOAL]
X : TopCat
Y : CompHaus
⊢ Function.RightInverse (fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) fun f =>
    ContinuousMap.mk (↑f ∘ stoneCechUnit)
[PROOFSTEP]
rintro
  ⟨f : (X : Type _) ⟶ Y, hf : Continuous f⟩
      -- Porting note: `ext` fails.
[GOAL]
case mk
X : TopCat
Y : CompHaus
f : ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ (fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit))
      ((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) (ContinuousMap.mk f)) =
    ContinuousMap.mk f
[PROOFSTEP]
apply ContinuousMap.ext
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : ↑X ⟶ ↑Y.toTop
hf : Continuous f
⊢ ∀ (a : ↑X),
    ↑((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit))
            ((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) (ContinuousMap.mk f)))
        a =
      ↑(ContinuousMap.mk f) a
[PROOFSTEP]
intro
[GOAL]
case mk.h
X : TopCat
Y : CompHaus
f : ↑X ⟶ ↑Y.toTop
hf : Continuous f
a✝ : ↑X
⊢ ↑((fun f => ContinuousMap.mk (↑f ∘ stoneCechUnit))
          ((fun f => ContinuousMap.mk (stoneCechExtend (_ : Continuous f.toFun))) (ContinuousMap.mk f)))
      a✝ =
    ↑(ContinuousMap.mk f) a✝
[PROOFSTEP]
exact congr_fun (stoneCechExtend_extends hf) _
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ CompactSpace ↑(TopCat.limitCone FF).pt
[PROOFSTEP]
show CompactSpace {u : ∀ j, F.obj j | ∀ {i j : J} (f : i ⟶ j), (F.map f) (u i) = u j}
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ CompactSpace ↑{u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
rw [← isCompact_iff_compactSpace]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ IsCompact {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
apply IsClosed.isCompact
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ IsClosed {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
have :
  {u : ∀ j, F.obj j | ∀ {i j : J} (f : i ⟶ j), F.map f (u i) = u j} =
    ⋂ (i : J) (j : J) (f : i ⟶ j), {u | F.map f (u i) = u j} :=
  by
  ext1
  simp only [Set.mem_iInter, Set.mem_setOf_eq]
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
[PROOFSTEP]
ext1
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
x✝ : (j : J) → ↑(F.obj j).toTop
⊢ x✝ ∈ {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} ↔
    x✝ ∈ ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
[PROOFSTEP]
simp only [Set.mem_iInter, Set.mem_setOf_eq]
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
⊢ IsClosed {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j}
[PROOFSTEP]
rw [this]
[GOAL]
case h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
⊢ IsClosed (⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
apply isClosed_iInter
[GOAL]
case h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
⊢ ∀ (i : J), IsClosed (⋂ (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
intro i
[GOAL]
case h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i : J
⊢ IsClosed (⋂ (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
apply isClosed_iInter
[GOAL]
case h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i : J
⊢ ∀ (i_1 : J), IsClosed (⋂ (f : i ⟶ i_1), {u | ↑(F.map f) (u i) = u i_1})
[PROOFSTEP]
intro j
[GOAL]
case h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
⊢ IsClosed (⋂ (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j})
[PROOFSTEP]
apply isClosed_iInter
[GOAL]
case h.h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
⊢ ∀ (i_1 : i ⟶ j), IsClosed {u | ↑(F.map i_1) (u i) = u j}
[PROOFSTEP]
intro f
[GOAL]
case h.h.h.h
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
f : i ⟶ j
⊢ IsClosed {u | ↑(F.map f) (u i) = u j}
[PROOFSTEP]
apply isClosed_eq
[GOAL]
case h.h.h.h.hf
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
f : i ⟶ j
⊢ Continuous fun x => ↑(F.map f) (x i)
[PROOFSTEP]
exact (ContinuousMap.continuous (F.map f)).comp (continuous_apply i)
[GOAL]
case h.h.h.h.hg
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
this :
  {u | ∀ {i j : J} (f : i ⟶ j), ↑(F.map f) (u i) = u j} = ⋂ (i : J) (j : J) (f : i ⟶ j), {u | ↑(F.map f) (u i) = u j}
i j : J
f : i ⟶ j
⊢ Continuous fun x => x j
[PROOFSTEP]
exact continuous_apply j
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
⊢ ∀ ⦃X Y : J⦄ (f : X ⟶ Y),
    ((Functor.const J).obj (mk (TopCat.limitCone FF).pt)).map f ≫ (fun j => NatTrans.app (TopCat.limitCone FF).π j) Y =
      (fun j => NatTrans.app (TopCat.limitCone FF).π j) X ≫ F.map f
[PROOFSTEP]
intro _ _ f
[GOAL]
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
X✝ Y✝ : J
f : X✝ ⟶ Y✝
⊢ ((Functor.const J).obj (mk (TopCat.limitCone FF).pt)).map f ≫ (fun j => NatTrans.app (TopCat.limitCone FF).π j) Y✝ =
    (fun j => NatTrans.app (TopCat.limitCone FF).π j) X✝ ≫ F.map f
[PROOFSTEP]
ext ⟨x, hx⟩
[GOAL]
case w.mk
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
X✝ Y✝ : J
f : X✝ ⟶ Y✝
x : (j : J) → ↑(FF.obj j)
hx : x ∈ {u | ∀ {i j : J} (f : i ⟶ j), ↑(FF.map f) (u i) = u j}
⊢ ↑(((Functor.const J).obj (mk (TopCat.limitCone FF).pt)).map f ≫ (fun j => NatTrans.app (TopCat.limitCone FF).π j) Y✝)
      { val := x, property := hx } =
    ↑((fun j => NatTrans.app (TopCat.limitCone FF).π j) X✝ ≫ F.map f) { val := x, property := hx }
[PROOFSTEP]
simp only [comp_apply, Functor.const_obj_map, id_apply]
[GOAL]
case w.mk
J : Type v
inst✝ : SmallCategory J
F : J ⥤ CompHaus
FF : J ⥤ TopCatMax := F ⋙ compHausToTop
X✝ Y✝ : J
f : X✝ ⟶ Y✝
x : (j : J) → ↑(FF.obj j)
hx : x ∈ {u | ∀ {i j : J} (f : i ⟶ j), ↑(FF.map f) (u i) = u j}
⊢ ↑(NatTrans.app (TopCat.limitCone (F ⋙ compHausToTop)).π Y✝)
      (↑(𝟙 (mk (TopCat.limitCone (F ⋙ compHausToTop)).pt)) { val := x, property := hx }) =
    ↑(F.map f) (↑(NatTrans.app (TopCat.limitCone (F ⋙ compHausToTop)).π X✝) { val := x, property := hx })
[PROOFSTEP]
exact (hx f).symm
[GOAL]
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f ↔ Function.Surjective ↑f
[PROOFSTEP]
constructor
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → Function.Surjective ↑f
[PROOFSTEP]
dsimp [Function.Surjective]
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Epi f → ∀ (b : (forget CompHaus).obj Y), ∃ a, ↑f a = b
[PROOFSTEP]
contrapose!
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ (∃ b, ∀ (a : (forget CompHaus).obj X), ↑f a ≠ b) → ¬Epi f
[PROOFSTEP]
rintro ⟨y, hy⟩ hf
[GOAL]
case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
⊢ False
[PROOFSTEP]
let C := Set.range f
[GOAL]
case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
⊢ False
[PROOFSTEP]
have hC : IsClosed C := (isCompact_range f.continuous).isClosed
[GOAL]
case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
⊢ False
[PROOFSTEP]
let D := ({ y } : Set Y)
[GOAL]
case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
⊢ False
[PROOFSTEP]
have hD : IsClosed D := isClosed_singleton
[GOAL]
case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ False
[PROOFSTEP]
have hCD : Disjoint C D := by
  rw [Set.disjoint_singleton_right]
  rintro ⟨y', hy'⟩
  exact hy y' hy'
[GOAL]
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ Disjoint C D
[PROOFSTEP]
rw [Set.disjoint_singleton_right]
[GOAL]
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
⊢ ¬y ∈ C
[PROOFSTEP]
rintro ⟨y', hy'⟩
[GOAL]
case intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
y' : (forget CompHaus).obj X
hy' : ↑f y' = y
⊢ False
[PROOFSTEP]
exact hy y' hy'
[GOAL]
case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
⊢ False
[PROOFSTEP]
haveI : NormalSpace ((forget CompHaus).obj Y) := normalOfCompactT2
[GOAL]
case mp.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this : NormalSpace ((forget CompHaus).obj Y)
⊢ False
[PROOFSTEP]
obtain ⟨φ, hφ0, hφ1, hφ01⟩ := exists_continuous_zero_one_of_closed hC hD hCD
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
⊢ False
[PROOFSTEP]
haveI : CompactSpace (ULift.{u} <| Set.Icc (0 : ℝ) 1) := Homeomorph.ulift.symm.compactSpace
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this : CompactSpace (ULift ↑(Set.Icc 0 1))
⊢ False
[PROOFSTEP]
haveI : T2Space (ULift.{u} <| Set.Icc (0 : ℝ) 1) := Homeomorph.ulift.symm.t2Space
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
⊢ False
[PROOFSTEP]
let Z := of (ULift.{u} <| Set.Icc (0 : ℝ) 1)
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
⊢ False
[PROOFSTEP]
let g : Y ⟶ Z := ⟨fun y' => ⟨⟨φ y', hφ01 y'⟩⟩, continuous_uLift_up.comp (φ.continuous.subtype_mk fun y' => hφ01 y')⟩
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
⊢ False
[PROOFSTEP]
let h : Y ⟶ Z := ⟨fun _ => ⟨⟨0, Set.left_mem_Icc.mpr zero_le_one⟩⟩, continuous_const⟩
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
⊢ False
[PROOFSTEP]
have H : h = g := by
  rw [← cancel_epi f]
  ext x
  apply ULift.ext
  apply Subtype.ext
  dsimp
    -- Porting note: This `change` is not ideal.
          -- I think lean is having issues understanding when a `ContinuousMap` should be considered
          -- as a morphism.
          -- TODO(?): Make morphisms in `CompHaus` (and other topological categories)
          -- into a one-field-structure.
  change 0 = φ (f x)
  simp only [hφ0 (Set.mem_range_self x), Pi.zero_apply]
[GOAL]
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
⊢ h = g
[PROOFSTEP]
rw [← cancel_epi f]
[GOAL]
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
⊢ f ≫ h = f ≫ g
[PROOFSTEP]
ext x
[GOAL]
case w
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ ↑(f ≫ h) x = ↑(f ≫ g) x
[PROOFSTEP]
apply ULift.ext
[GOAL]
case w.h
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ (↑(f ≫ h) x).down = (↑(f ≫ g) x).down
[PROOFSTEP]
apply Subtype.ext
[GOAL]
case w.h.a
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ ↑(↑(f ≫ h) x).down = ↑(↑(f ≫ g) x).down
[PROOFSTEP]
dsimp
  -- Porting note: This `change` is not ideal.
        -- I think lean is having issues understanding when a `ContinuousMap` should be considered
        -- as a morphism.
        -- TODO(?): Make morphisms in `CompHaus` (and other topological categories)
        -- into a one-field-structure.
[GOAL]
case w.h.a
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ ↑(↑(f ≫ ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }) x).down =
    ↑(↑(f ≫ ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }) x).down
[PROOFSTEP]
change 0 = φ (f x)
[GOAL]
case w.h.a
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
x : (forget CompHaus).obj X
⊢ 0 = ↑φ (↑f x)
[PROOFSTEP]
simp only [hφ0 (Set.mem_range_self x), Pi.zero_apply]
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : h = g
⊢ False
[PROOFSTEP]
apply_fun fun e => (e y).down.1 at H
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : ↑(↑h y).down = ↑(↑g y).down
⊢ False
[PROOFSTEP]
dsimp at H
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H :
  ↑(↑(ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }) y).down =
    ↑(↑(ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }) y).down
⊢ False
[PROOFSTEP]
change 0 = φ y at H
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : 0 = ↑φ y
⊢ False
[PROOFSTEP]
simp only [hφ1 (Set.mem_singleton y), Pi.one_apply] at H
[GOAL]
case mp.intro.intro.intro.intro
X Y : CompHaus
f : X ⟶ Y
y : (forget CompHaus).obj Y
hy : ∀ (a : (forget CompHaus).obj X), ↑f a ≠ y
hf : Epi f
C : Set ((forget CompHaus).obj Y) := Set.range ↑f
hC : IsClosed C
D : Set ↑Y.toTop := {y}
hD : IsClosed D
hCD : Disjoint C D
this✝¹ : NormalSpace ((forget CompHaus).obj Y)
φ : C((forget CompHaus).obj Y, ℝ)
hφ0 : Set.EqOn (↑φ) 0 C
hφ1 : Set.EqOn (↑φ) 1 D
hφ01 : ∀ (x : (forget CompHaus).obj Y), ↑φ x ∈ Set.Icc 0 1
this✝ : CompactSpace (ULift ↑(Set.Icc 0 1))
this : T2Space (ULift ↑(Set.Icc 0 1))
Z : CompHaus := of (ULift ↑(Set.Icc 0 1))
g : Y ⟶ Z := ContinuousMap.mk fun y' => { down := { val := ↑φ y', property := (_ : ↑φ y' ∈ Set.Icc 0 1) } }
h : Y ⟶ Z := ContinuousMap.mk fun x => { down := { val := 0, property := (_ : 0 ∈ Set.Icc 0 1) } }
H : 0 = 1
⊢ False
[PROOFSTEP]
exact zero_ne_one H
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Function.Surjective ↑f → Epi f
[PROOFSTEP]
rw [← CategoryTheory.epi_iff_surjective]
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Epi ↑f → Epi f
[PROOFSTEP]
apply (forget CompHaus).epi_of_epi_map
[GOAL]
X Y : CompHaus
f : X ⟶ Y
⊢ Mono f ↔ Function.Injective ↑f
[PROOFSTEP]
constructor
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
⊢ Mono f → Function.Injective ↑f
[PROOFSTEP]
intro hf x₁ x₂ h
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
⊢ x₁ = x₂
[PROOFSTEP]
let g₁ : of PUnit ⟶ X := ⟨fun _ => x₁, continuous_const⟩
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
⊢ x₁ = x₂
[PROOFSTEP]
let g₂ : of PUnit ⟶ X := ⟨fun _ => x₂, continuous_const⟩
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
⊢ x₁ = x₂
[PROOFSTEP]
have : g₁ ≫ f = g₂ ≫ f := by
  ext
  exact h
[GOAL]
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
⊢ g₁ ≫ f = g₂ ≫ f
[PROOFSTEP]
ext
[GOAL]
case w
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
x✝ : (forget CompHaus).obj (of PUnit)
⊢ ↑(g₁ ≫ f) x✝ = ↑(g₂ ≫ f) x✝
[PROOFSTEP]
exact h
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
this : g₁ ≫ f = g₂ ≫ f
⊢ x₁ = x₂
[PROOFSTEP]
rw [cancel_mono] at this
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
this : g₁ = g₂
⊢ x₁ = x₂
[PROOFSTEP]
apply_fun fun e => e PUnit.unit at this
[GOAL]
case mp
X Y : CompHaus
f : X ⟶ Y
hf : Mono f
x₁ x₂ : (forget CompHaus).obj X
h : ↑f x₁ = ↑f x₂
g₁ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₁
g₂ : of PUnit ⟶ X := ContinuousMap.mk fun x => x₂
this : ↑g₁ PUnit.unit = ↑g₂ PUnit.unit
⊢ x₁ = x₂
[PROOFSTEP]
exact this
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Function.Injective ↑f → Mono f
[PROOFSTEP]
rw [← CategoryTheory.mono_iff_injective]
[GOAL]
case mpr
X Y : CompHaus
f : X ⟶ Y
⊢ Mono ↑f → Mono f
[PROOFSTEP]
apply (forget CompHaus).mono_of_mono_map