[GOAL]
⊢ ConcreteCategory MeasCat
[PROOFSTEP]
unfold MeasCat
[GOAL]
⊢ ConcreteCategory (Bundled MeasurableSpace)
[PROOFSTEP]
infer_instance
[GOAL]
μ : MeasureTheory.Measure (MeasureTheory.Measure ℝ≥0∞)
⊢ ∫⁻ (x : ℝ≥0∞), x ∂Measure.join μ = ∫⁻ (x : ℝ≥0∞), x ∂Measure.map (fun m => ∫⁻ (x : ℝ≥0∞), x ∂m) μ
[PROOFSTEP]
rw [Measure.lintegral_join, lintegral_map]
[GOAL]
case hf
μ : MeasureTheory.Measure (MeasureTheory.Measure ℝ≥0∞)
⊢ Measurable fun x => x
[PROOFSTEP]
apply_rules [measurable_id, Measure.measurable_lintegral]
[GOAL]
case hg
μ : MeasureTheory.Measure (MeasureTheory.Measure ℝ≥0∞)
⊢ Measurable fun m => ∫⁻ (x : ℝ≥0∞), x ∂m
[PROOFSTEP]
apply_rules [measurable_id, Measure.measurable_lintegral]
[GOAL]
μ : MeasureTheory.Measure (MeasureTheory.Measure ℝ≥0∞)
⊢ Measurable fun x => x
[PROOFSTEP]
apply_rules [measurable_id, Measure.measurable_lintegral]


[GOAL]
α : Type u
inst✝ : Monoid α
v i₁ : α
vi₁ : v * i₁ = 1
iv₁ : i₁ * v = 1
v' i₂ : α
vi₂ : v' * i₂ = 1
iv₂ : i₂ * v' = 1
e : ↑{ val := v, inv := i₁, val_inv := vi₁, inv_val := iv₁ } = ↑{ val := v', inv := i₂, val_inv := vi₂, inv_val := iv₂ }
⊢ { val := v, inv := i₁, val_inv := vi₁, inv_val := iv₁ } = { val := v', inv := i₂, val_inv := vi₂, inv_val := iv₂ }
[PROOFSTEP]
simp only at e
[GOAL]
α : Type u
inst✝ : Monoid α
v i₁ : α
vi₁ : v * i₁ = 1
iv₁ : i₁ * v = 1
v' i₂ : α
vi₂ : v' * i₂ = 1
iv₂ : i₂ * v' = 1
e : v = v'
⊢ { val := v, inv := i₁, val_inv := vi₁, inv_val := iv₁ } = { val := v', inv := i₂, val_inv := vi₂, inv_val := iv₂ }
[PROOFSTEP]
subst v'
[GOAL]
α : Type u
inst✝ : Monoid α
v i₁ : α
vi₁ : v * i₁ = 1
iv₁ : i₁ * v = 1
i₂ : α
vi₂ : v * i₂ = 1
iv₂ : i₂ * v = 1
⊢ { val := v, inv := i₁, val_inv := vi₁, inv_val := iv₁ } = { val := v, inv := i₂, val_inv := vi₂, inv_val := iv₂ }
[PROOFSTEP]
congr
[GOAL]
case e_inv
α : Type u
inst✝ : Monoid α
v i₁ : α
vi₁ : v * i₁ = 1
iv₁ : i₁ * v = 1
i₂ : α
vi₂ : v * i₂ = 1
iv₂ : i₂ * v = 1
⊢ i₁ = i₂
[PROOFSTEP]
simpa only [iv₂, vi₁, one_mul, mul_one] using mul_assoc i₂ v i₁
[GOAL]
α : Type u
inst✝ : Monoid α
u₁ u₂ : αˣ
⊢ ↑u₁ * ↑u₂ * (u₂.inv * u₁.inv) = 1
[PROOFSTEP]
rw [mul_assoc, ← mul_assoc u₂.val, val_inv, one_mul, val_inv]
[GOAL]
α : Type u
inst✝ : Monoid α
u₁ u₂ : αˣ
⊢ u₂.inv * u₁.inv * (↑u₁ * ↑u₂) = 1
[PROOFSTEP]
rw [mul_assoc, ← mul_assoc u₁.inv, inv_val, one_mul, inv_val]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u a : αˣ
⊢ ↑a = 1 ↔ a = 1
[PROOFSTEP]
rw [← Units.val_one, eq_iff]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
h : ↑u = a
⊢ ↑u⁻¹ * a = 1
[PROOFSTEP]
rw [← h, u.inv_mul]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
h : ↑u = a
⊢ a * ↑u⁻¹ = 1
[PROOFSTEP]
rw [← h, u.mul_inv]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c u a : αˣ
b : α
⊢ ↑a * (↑a⁻¹ * b) = b
[PROOFSTEP]
rw [← mul_assoc, mul_inv, one_mul]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c u a : αˣ
b : α
⊢ ↑a⁻¹ * (↑a * b) = b
[PROOFSTEP]
rw [← mul_assoc, inv_mul, one_mul]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c u : αˣ
a : α
b : αˣ
⊢ a * ↑b * ↑b⁻¹ = a
[PROOFSTEP]
rw [mul_assoc, mul_inv, mul_one]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c u : αˣ
a : α
b : αˣ
⊢ a * ↑b⁻¹ * ↑b = a
[PROOFSTEP]
rw [mul_assoc, inv_mul, mul_one]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c✝ u a : αˣ
b c : α
h : ↑a * b = ↑a * c
⊢ b = c
[PROOFSTEP]
simpa only [inv_mul_cancel_left] using congr_arg (fun x : α => ↑(a⁻¹ : αˣ) * x) h
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c✝ u a : αˣ
b c : α
h : b * ↑a = c * ↑a
⊢ b = c
[PROOFSTEP]
simpa only [mul_inv_cancel_right] using congr_arg (fun x : α => x * ↑(a⁻¹ : αˣ)) h
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c u : αˣ
a b : α
h : a = b * ↑c⁻¹
⊢ a * ↑c = b
[PROOFSTEP]
rw [h, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b✝ c u : αˣ
a b : α
h : a * ↑c = b
⊢ a = b * ↑c⁻¹
[PROOFSTEP]
rw [← h, mul_inv_cancel_right]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c✝ u : αˣ
a c : α
h : a = ↑b⁻¹ * c
⊢ ↑b * a = c
[PROOFSTEP]
rw [h, mul_inv_cancel_left]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c✝ u : αˣ
a c : α
h : ↑b * a = c
⊢ a = ↑b⁻¹ * c
[PROOFSTEP]
rw [← h, inv_mul_cancel_left]
[GOAL]
α : Type u
inst✝ : Monoid α
a b✝ c✝ u : αˣ
b c : α
h : ↑a⁻¹ * b = c
⊢ b = ↑a * c
[PROOFSTEP]
rw [← h, mul_inv_cancel_left]
[GOAL]
α : Type u
inst✝ : Monoid α
a b✝ c✝ u : αˣ
b c : α
h : b = ↑a * c
⊢ ↑a⁻¹ * b = c
[PROOFSTEP]
rw [h, inv_mul_cancel_left]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c✝ u : αˣ
a c : α
h : a * ↑b⁻¹ = c
⊢ a = c * ↑b
[PROOFSTEP]
rw [← h, inv_mul_cancel_right]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c✝ u : αˣ
a c : α
h : a = c * ↑b
⊢ a * ↑b⁻¹ = c
[PROOFSTEP]
rw [h, mul_inv_cancel_right]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
h : a * ↑u = 1
⊢ ↑u⁻¹ = 1 * ↑u⁻¹
[PROOFSTEP]
rw [one_mul]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
h : a * ↑u = 1
⊢ 1 * ↑u⁻¹ = a
[PROOFSTEP]
rw [← h, mul_inv_cancel_right]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
h : ↑u * a = 1
⊢ ↑u⁻¹ = ↑u⁻¹ * 1
[PROOFSTEP]
rw [mul_one]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
h : ↑u * a = 1
⊢ ↑u⁻¹ * 1 = a
[PROOFSTEP]
rw [← h, inv_mul_cancel_left]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
⊢ a * ↑u = 1 ↔ a = ↑u⁻¹
[PROOFSTEP]
rw [← mul_inv_eq_one, inv_inv]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c u : αˣ
a : α
⊢ ↑u * a = 1 ↔ ↑u⁻¹ = a
[PROOFSTEP]
rw [← inv_mul_eq_one, inv_inv]
[GOAL]
α : Type u
inst✝ : Monoid α
a b c u u₁ u₂ : αˣ
h : ↑u₁ = ↑u₂
⊢ ↑u₁ * ↑u₂⁻¹ = 1
[PROOFSTEP]
rw [h, u₂.mul_inv]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c a : α
u : αˣ
⊢ a * (↑u⁻¹ * ↑u) = a
[PROOFSTEP]
rw [Units.inv_mul, mul_one]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c a : α
u : αˣ
⊢ a * (↑u * ↑u⁻¹) = a
[PROOFSTEP]
rw [Units.mul_inv, mul_one]
[GOAL]
α : Type u
inst✝ : Monoid α
a b c x : α
u₁ u₂ : αˣ
⊢ x /ₚ u₁ /ₚ u₂ = x /ₚ (u₂ * u₁)
[PROOFSTEP]
simp only [divp, mul_inv_rev, Units.val_mul, mul_assoc]
[GOAL]
α : Type u
inst✝ : Monoid α
a b c x : α
u : αˣ
y : α
⊢ x /ₚ u * ↑u = y * ↑u ↔ y * ↑u = x
[PROOFSTEP]
rw [divp_mul_cancel]
[GOAL]
α : Type u
inst✝ : Monoid α
a b c x : α
u : αˣ
y : α
⊢ x = y * ↑u ↔ y * ↑u = x
[PROOFSTEP]
exact ⟨Eq.symm, Eq.symm⟩
[GOAL]
α : Type u
inst✝ : Monoid α
a b c x : α
u : αˣ
y : α
⊢ x = y /ₚ u ↔ x * ↑u = y
[PROOFSTEP]
rw [eq_comm, divp_eq_iff_mul_eq]
[GOAL]
α : Type u
inst✝ : Monoid α
a✝ b c a : α
u : αˣ
⊢ a /ₚ u * ↑u = 1 * ↑u ↔ a = ↑u
[PROOFSTEP]
rw [divp_mul_cancel, one_mul]
[GOAL]
α : Type u
inst✝ : Monoid α
a b c : α
u : αˣ
⊢ ↑u⁻¹ = 1 /ₚ u
[PROOFSTEP]
rw [one_divp]
[GOAL]
α : Type u
inst✝ : Monoid α
a b c : α
u : αˣ
⊢ ↑(1 / u) = 1 /ₚ u
[PROOFSTEP]
rw [one_div, one_divp]
[GOAL]
α : Type u
inst✝ : Monoid α
a b c : α
u₁ u₂ : αˣ
⊢ ↑(u₁ / u₂) = ↑u₁ /ₚ u₂
[PROOFSTEP]
rw [divp, division_def, Units.val_mul]
[GOAL]
α : Type u
inst✝ : CommMonoid α
x y : α
u : αˣ
⊢ x /ₚ u * y = x * y /ₚ u
[PROOFSTEP]
rw [divp, divp, mul_right_comm]
[GOAL]
α : Type u
inst✝ : CommMonoid α
x y : α
ux uy : αˣ
⊢ x /ₚ ux = y /ₚ uy ↔ x * ↑uy = y * ↑ux
[PROOFSTEP]
rw [divp_eq_iff_mul_eq, divp_mul_eq_mul_divp, divp_eq_iff_mul_eq]
[GOAL]
α : Type u
inst✝ : CommMonoid α
x y : α
ux uy : αˣ
⊢ x /ₚ ux * (y /ₚ uy) = x * y /ₚ (ux * uy)
[PROOFSTEP]
rw [divp_mul_eq_mul_divp, divp_assoc', divp_divp_eq_divp_mul]
[GOAL]
α : Type u
inst✝¹ : CommMonoid α
inst✝ : Subsingleton αˣ
a b : α
h : a * b = 1
⊢ b * a = 1
[PROOFSTEP]
rwa [mul_comm]
[GOAL]
α : Type u
inst✝¹ : CommMonoid α
inst✝ : Subsingleton αˣ
a b : α
h : a * b = 1
⊢ b * a = 1
[PROOFSTEP]
rwa [mul_comm]
[GOAL]
α : Type u
inst✝¹ : CommMonoid α
inst✝ : Subsingleton αˣ
a b : α
⊢ a = 1 ∧ b = 1 → a * b = 1
[PROOFSTEP]
rintro ⟨rfl, rfl⟩
[GOAL]
case intro
α : Type u
inst✝¹ : CommMonoid α
inst✝ : Subsingleton αˣ
⊢ 1 * 1 = 1
[PROOFSTEP]
exact mul_one _
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a : M
h : IsUnit a
⊢ ∃ b, a * b = 1
[PROOFSTEP]
rcases h with ⟨⟨a, b, hab, _⟩, rfl⟩
[GOAL]
case intro.mk
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a b : M
hab : a * b = 1
inv_val✝ : b * a = 1
⊢ ∃ b_1, ↑{ val := a, inv := b, val_inv := hab, inv_val := inv_val✝ } * b_1 = 1
[PROOFSTEP]
exact ⟨b, hab⟩
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a : M
h : IsUnit a
⊢ ∃ b, b * a = 1
[PROOFSTEP]
rcases h with ⟨⟨a, b, _, hba⟩, rfl⟩
[GOAL]
case intro.mk
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a b : M
val_inv✝ : a * b = 1
hba : b * a = 1
⊢ ∃ b_1, b_1 * ↑{ val := a, inv := b, val_inv := val_inv✝, inv_val := hba } = 1
[PROOFSTEP]
exact ⟨b, hba⟩
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : CommMonoid M
a : M
⊢ IsUnit a ↔ ∃ b, b * a = 1
[PROOFSTEP]
simp [isUnit_iff_exists_inv, mul_comm]
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
x y : M
⊢ IsUnit x → IsUnit y → IsUnit (x * y)
[PROOFSTEP]
rintro ⟨x, rfl⟩ ⟨y, rfl⟩
[GOAL]
case intro.intro
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
x y : Mˣ
⊢ IsUnit (↑x * ↑y)
[PROOFSTEP]
exact ⟨x * y, Units.val_mul _ _⟩
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a : M
u : Mˣ
x✝ : IsUnit (a * ↑u)
v : Mˣ
hv : ↑v = a * ↑u
⊢ IsUnit a
[PROOFSTEP]
have : IsUnit (a * ↑u * ↑u⁻¹) := by exists v * u⁻¹; rw [← hv, Units.val_mul]
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a : M
u : Mˣ
x✝ : IsUnit (a * ↑u)
v : Mˣ
hv : ↑v = a * ↑u
⊢ IsUnit (a * ↑u * ↑u⁻¹)
[PROOFSTEP]
exists v * u⁻¹
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a : M
u : Mˣ
x✝ : IsUnit (a * ↑u)
v : Mˣ
hv : ↑v = a * ↑u
⊢ ↑(v * u⁻¹) = a * ↑u * ↑u⁻¹
[PROOFSTEP]
rw [← hv, Units.val_mul]
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a : M
u : Mˣ
x✝ : IsUnit (a * ↑u)
v : Mˣ
hv : ↑v = a * ↑u
this : IsUnit (a * ↑u * ↑u⁻¹)
⊢ IsUnit a
[PROOFSTEP]
rwa [mul_assoc, Units.mul_inv, mul_one] at this
[GOAL]
α : Type u
M✝ : Type u_1
N : Type u_2
M : Type u_3
inst✝ : Monoid M
u : Mˣ
a : M
x✝ : IsUnit (↑u * a)
v : Mˣ
hv : ↑v = ↑u * a
⊢ IsUnit a
[PROOFSTEP]
have : IsUnit (↑u⁻¹ * (↑u * a)) := by exists u⁻¹ * v; rw [← hv, Units.val_mul]
[GOAL]
α : Type u
M✝ : Type u_1
N : Type u_2
M : Type u_3
inst✝ : Monoid M
u : Mˣ
a : M
x✝ : IsUnit (↑u * a)
v : Mˣ
hv : ↑v = ↑u * a
⊢ IsUnit (↑u⁻¹ * (↑u * a))
[PROOFSTEP]
exists u⁻¹ * v
[GOAL]
α : Type u
M✝ : Type u_1
N : Type u_2
M : Type u_3
inst✝ : Monoid M
u : Mˣ
a : M
x✝ : IsUnit (↑u * a)
v : Mˣ
hv : ↑v = ↑u * a
⊢ ↑(u⁻¹ * v) = ↑u⁻¹ * (↑u * a)
[PROOFSTEP]
rw [← hv, Units.val_mul]
[GOAL]
α : Type u
M✝ : Type u_1
N : Type u_2
M : Type u_3
inst✝ : Monoid M
u : Mˣ
a : M
x✝ : IsUnit (↑u * a)
v : Mˣ
hv : ↑v = ↑u * a
this : IsUnit (↑u⁻¹ * (↑u * a))
⊢ IsUnit a
[PROOFSTEP]
rwa [← mul_assoc, Units.inv_mul, one_mul] at this
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : CommMonoid M
x y : M
hu : IsUnit (x * y)
z : M
hz : x * y * z = 1
⊢ x * (y * z) = 1
[PROOFSTEP]
rwa [← mul_assoc]
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : CommMonoid M
x y : M
hu : IsUnit (x * y)
⊢ IsUnit (y * x)
[PROOFSTEP]
rwa [mul_comm]
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a b c : M
h : IsUnit a
⊢ a * ↑(IsUnit.unit h)⁻¹ = 1
[PROOFSTEP]
rw [← h.unit.mul_inv]
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : Monoid M
a b c : M
h : IsUnit a
⊢ a * ↑(IsUnit.unit h)⁻¹ = ↑(IsUnit.unit h) * ↑(IsUnit.unit h)⁻¹
[PROOFSTEP]
congr
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : DivisionMonoid M
a : M
⊢ IsUnit a → a⁻¹ * a = 1
[PROOFSTEP]
rintro ⟨u, rfl⟩
[GOAL]
case intro
α : Type u
M : Type u_1
N : Type u_2
inst✝ : DivisionMonoid M
u : Mˣ
⊢ (↑u)⁻¹ * ↑u = 1
[PROOFSTEP]
rw [← Units.val_inv_eq_inv_val, Units.inv_mul]
[GOAL]
α : Type u
M : Type u_1
N : Type u_2
inst✝ : DivisionMonoid M
a : M
⊢ IsUnit a → a * a⁻¹ = 1
[PROOFSTEP]
rintro ⟨u, rfl⟩
[GOAL]
case intro
α : Type u
M : Type u_1
N : Type u_2
inst✝ : DivisionMonoid M
u : Mˣ
⊢ ↑u * (↑u)⁻¹ = 1
[PROOFSTEP]
rw [← Units.val_inv_eq_inv_val, Units.mul_inv]
[GOAL]
α : Type u
M : Type u_1
hM : Monoid M
h : ∀ (a : M), IsUnit a
a : M
⊢ a⁻¹ * a = 1
[PROOFSTEP]
change ↑(h a).unit⁻¹ * a = 1
[GOAL]
α : Type u
M : Type u_1
hM : Monoid M
h : ∀ (a : M), IsUnit a
a : M
⊢ ↑(IsUnit.unit (_ : IsUnit a))⁻¹ * a = 1
[PROOFSTEP]
rw [Units.inv_mul_eq_iff_eq_mul, (h a).unit_spec, mul_one]
[GOAL]
α : Type u
M : Type u_1
hM : CommMonoid M
h : ∀ (a : M), IsUnit a
a : M
⊢ a⁻¹ * a = 1
[PROOFSTEP]
change ↑(h a).unit⁻¹ * a = 1
[GOAL]
α : Type u
M : Type u_1
hM : CommMonoid M
h : ∀ (a : M), IsUnit a
a : M
⊢ ↑(IsUnit.unit (_ : IsUnit a))⁻¹ * a = 1
[PROOFSTEP]
rw [Units.inv_mul_eq_iff_eq_mul, (h a).unit_spec, mul_one]


[GOAL]
m✝ n✝ m n : ℕ
h : m ≤ n
⊢ m ! ∣ n !
[PROOFSTEP]
induction' n with n IH
[GOAL]
case zero
m✝ n✝ m n : ℕ
h✝ : m ≤ n
h : m ≤ zero
⊢ m ! ∣ zero !
[PROOFSTEP]
simp [Nat.eq_zero_of_le_zero h]
[GOAL]
case succ
m✝ n✝¹ m n✝ : ℕ
h✝ : m ≤ n✝
n : ℕ
IH : m ≤ n → m ! ∣ n !
h : m ≤ succ n
⊢ m ! ∣ (succ n)!
[PROOFSTEP]
obtain rfl | hl := h.eq_or_lt
[GOAL]
case succ.inl
m n✝¹ n✝ n : ℕ
h✝ : succ n ≤ n✝
IH : succ n ≤ n → (succ n)! ∣ n !
h : succ n ≤ succ n
⊢ (succ n)! ∣ (succ n)!
[PROOFSTEP]
simp
[GOAL]
case succ.inr
m✝ n✝¹ m n✝ : ℕ
h✝ : m ≤ n✝
n : ℕ
IH : m ≤ n → m ! ∣ n !
h : m ≤ succ n
hl : m < succ n
⊢ m ! ∣ (succ n)!
[PROOFSTEP]
exact (IH (le_of_lt_succ hl)).mul_left _
[GOAL]
m✝ n m : ℕ
⊢ m ! * succ m ^ 0 ≤ (m + 0)!
[PROOFSTEP]
simp
[GOAL]
m✝ n✝ m n : ℕ
⊢ m ! * succ m ^ (n + 1) ≤ (m + (n + 1))!
[PROOFSTEP]
rw [← add_assoc, ← Nat.succ_eq_add_one (m + n), Nat.factorial_succ, pow_succ', mul_comm (_ + 1), mul_comm (succ m), ←
  mul_assoc]
[GOAL]
m✝ n✝ m n : ℕ
⊢ m ! * succ m ^ n * succ m ≤ (m + n)! * (m + n + 1)
[PROOFSTEP]
exact
  mul_le_mul factorial_mul_pow_le_factorial (Nat.succ_le_succ (Nat.le_add_right _ _)) (Nat.zero_le _) (Nat.zero_le _)
[GOAL]
m n : ℕ
hn : 0 < n
⊢ n ! < m ! ↔ n < m
[PROOFSTEP]
refine' ⟨fun h => not_le.mp fun hmn => not_le_of_lt h (factorial_le hmn), fun h => _⟩
[GOAL]
m n : ℕ
hn : 0 < n
h : n < m
⊢ n ! < m !
[PROOFSTEP]
have : ∀ {n}, 0 < n → n ! < n.succ ! := by
  intro k hk
  rw [factorial_succ, succ_mul, lt_add_iff_pos_left]
  exact mul_pos hk k.factorial_pos
[GOAL]
m n : ℕ
hn : 0 < n
h : n < m
⊢ ∀ {n : ℕ}, 0 < n → n ! < (succ n)!
[PROOFSTEP]
intro k hk
[GOAL]
m n : ℕ
hn : 0 < n
h : n < m
k : ℕ
hk : 0 < k
⊢ k ! < (succ k)!
[PROOFSTEP]
rw [factorial_succ, succ_mul, lt_add_iff_pos_left]
[GOAL]
m n : ℕ
hn : 0 < n
h : n < m
k : ℕ
hk : 0 < k
⊢ 0 < k * k !
[PROOFSTEP]
exact mul_pos hk k.factorial_pos
[GOAL]
m n : ℕ
hn : 0 < n
h : n < m
this : ∀ {n : ℕ}, 0 < n → n ! < (succ n)!
⊢ n ! < m !
[PROOFSTEP]
induction' h with k hnk ih generalizing hn
[GOAL]
case refl
m n : ℕ
hn✝ : 0 < n
this : ∀ {n : ℕ}, 0 < n → n ! < (succ n)!
hn : 0 < n
⊢ n ! < (succ n)!
[PROOFSTEP]
exact this hn
[GOAL]
case step
m n : ℕ
hn✝ : 0 < n
this : ∀ {n : ℕ}, 0 < n → n ! < (succ n)!
k : ℕ
hnk : Nat.le (succ n) k
ih : 0 < n → n ! < k !
hn : 0 < n
⊢ n ! < (succ k)!
[PROOFSTEP]
exact (ih hn).trans (this <| hn.trans <| lt_of_succ_le hnk)
[GOAL]
m n : ℕ
⊢ n ! = 1 ↔ n ≤ 1
[PROOFSTEP]
apply Iff.intro
[GOAL]
case mp
m n : ℕ
⊢ n ! = 1 → n ≤ 1
[PROOFSTEP]
intro
[GOAL]
case mpr
m n : ℕ
⊢ n ≤ 1 → n ! = 1
[PROOFSTEP]
intro
[GOAL]
case mp
m n : ℕ
a✝ : n ! = 1
⊢ n ≤ 1
[PROOFSTEP]
rw [← not_lt, ← one_lt_factorial, ‹n ! = 1›]
[GOAL]
case mp
m n : ℕ
a✝ : n ! = 1
⊢ ¬1 < 1
[PROOFSTEP]
apply lt_irrefl
[GOAL]
case mpr
m n : ℕ
a✝ : n ≤ 1
⊢ n ! = 1
[PROOFSTEP]
cases ‹n ≤ 1›
[GOAL]
case mpr.refl
m : ℕ
⊢ 1! = 1
[PROOFSTEP]
rfl
[GOAL]
case mpr.step
m n : ℕ
a✝ : Nat.le n 0
⊢ n ! = 1
[PROOFSTEP]
cases ‹n ≤ 0›
[GOAL]
case mpr.step.refl
m : ℕ
⊢ 0! = 1
[PROOFSTEP]
rfl
[GOAL]
m n : ℕ
hn : 1 < n !
⊢ n ! = m ! ↔ n = m
[PROOFSTEP]
refine' ⟨fun h => _, congr_arg _⟩
[GOAL]
m n : ℕ
hn : 1 < n !
h : n ! = m !
⊢ n = m
[PROOFSTEP]
obtain hnm | rfl | hnm := lt_trichotomy n m
[GOAL]
case inl
m n : ℕ
hn : 1 < n !
h : n ! = m !
hnm : n < m
⊢ n = m
[PROOFSTEP]
rw [← factorial_lt <| pos_of_gt <| one_lt_factorial.mp hn, h] at hnm
[GOAL]
case inl
m n : ℕ
hn : 1 < n !
h : n ! = m !
hnm : m ! < m !
⊢ n = m
[PROOFSTEP]
cases lt_irrefl _ hnm
[GOAL]
case inr.inl
n : ℕ
hn : 1 < n !
h : n ! = n !
⊢ n = n
[PROOFSTEP]
rfl
[GOAL]
case inr.inr
m n : ℕ
hn : 1 < n !
h : n ! = m !
hnm : m < n
⊢ n = m
[PROOFSTEP]
rw [h, one_lt_factorial] at hn
[GOAL]
case inr.inr
m n : ℕ
hn : 1 < m
h : n ! = m !
hnm : m < n
⊢ n = m
[PROOFSTEP]
rw [← factorial_lt (lt_trans one_pos hn), h] at hnm
[GOAL]
case inr.inr
m n : ℕ
hn : 1 < m
h : n ! = m !
hnm : m ! < m !
⊢ n = m
[PROOFSTEP]
cases lt_irrefl _ hnm
[GOAL]
m n✝ n : ℕ
hi : 3 ≤ n
⊢ n < n !
[PROOFSTEP]
have : 0 < n := (by decide : 0 < 2).trans (succ_le_iff.mp hi)
[GOAL]
m n✝ n : ℕ
hi : 3 ≤ n
⊢ 0 < 2
[PROOFSTEP]
decide
[GOAL]
m n✝ n : ℕ
hi : 3 ≤ n
this : 0 < n
⊢ n < n !
[PROOFSTEP]
have : 1 < pred n := le_pred_of_lt (succ_le_iff.mp hi)
[GOAL]
m n✝ n : ℕ
hi : 3 ≤ n
this✝ : 0 < n
this : 1 < pred n
⊢ n < n !
[PROOFSTEP]
rw [← succ_pred_eq_of_pos ‹0 < n›, factorial_succ]
[GOAL]
m n✝ n : ℕ
hi : 3 ≤ n
this✝ : 0 < n
this : 1 < pred n
⊢ succ (pred n) < (pred n + 1) * (pred n)!
[PROOFSTEP]
exact lt_mul_of_one_lt_right (pred n).succ_pos ((‹1 < pred n›).trans_le (self_le_factorial _))
[GOAL]
m n✝ i n : ℕ
hi : 2 ≤ i
⊢ i + (n + 1)! < (i + n + 1)!
[PROOFSTEP]
rw [← Nat.succ_eq_add_one (i + _), factorial_succ (i + _), add_mul, one_mul]
[GOAL]
m n✝ i n : ℕ
hi : 2 ≤ i
⊢ i + (n + 1)! < (i + n) * (i + n)! + (i + n)!
[PROOFSTEP]
have : i ≤ i + n := le.intro rfl
[GOAL]
m n✝ i n : ℕ
hi : 2 ≤ i
this : i ≤ i + n
⊢ i + (n + 1)! < (i + n) * (i + n)! + (i + n)!
[PROOFSTEP]
exact
  add_lt_add_of_lt_of_le
    (this.trans_lt
      ((lt_mul_iff_one_lt_right ((by decide : 0 < 2).trans_le (hi.trans this))).mpr
        (lt_iff_le_and_ne.mpr
          ⟨(i + n).factorial_pos, fun g =>
            Nat.not_succ_le_self 1 ((hi.trans this).trans (factorial_eq_one.mp g.symm))⟩)))
    (factorial_le ((le_of_eq (add_comm n 1)).trans ((add_le_add_iff_right n).mpr ((by decide : 1 ≤ 2).trans hi))))
[GOAL]
m n✝ i n : ℕ
hi : 2 ≤ i
this : i ≤ i + n
⊢ 0 < 2
[PROOFSTEP]
decide
[GOAL]
m n✝ i n : ℕ
hi : 2 ≤ i
this : i ≤ i + n
⊢ 1 ≤ 2
[PROOFSTEP]
decide
[GOAL]
m n✝ i n : ℕ
hi : 2 ≤ i
hn : 1 ≤ n
⊢ i + n ! < (i + n)!
[PROOFSTEP]
cases hn
[GOAL]
case refl
m n i : ℕ
hi : 2 ≤ i
⊢ i + 1! < (i + 1)!
[PROOFSTEP]
rw [factorial_one]
[GOAL]
case refl
m n i : ℕ
hi : 2 ≤ i
⊢ i + 1 < (i + 1)!
[PROOFSTEP]
exact lt_factorial_self (succ_le_succ hi)
[GOAL]
case step
m n i : ℕ
hi : 2 ≤ i
m✝ : ℕ
a✝ : Nat.le 1 m✝
⊢ i + (succ m✝)! < (i + succ m✝)!
[PROOFSTEP]
exact add_factorial_succ_lt_factorial_add_succ _ hi
[GOAL]
m n✝ i n : ℕ
⊢ i + (n + 1)! ≤ (i + (n + 1))!
[PROOFSTEP]
cases (le_or_lt (2 : ℕ) i)
[GOAL]
case inl
m n✝ i n : ℕ
h✝ : 2 ≤ i
⊢ i + (n + 1)! ≤ (i + (n + 1))!
[PROOFSTEP]
rw [← add_assoc]
[GOAL]
case inl
m n✝ i n : ℕ
h✝ : 2 ≤ i
⊢ i + (n + 1)! ≤ (i + n + 1)!
[PROOFSTEP]
apply Nat.le_of_lt
[GOAL]
case inl.h
m n✝ i n : ℕ
h✝ : 2 ≤ i
⊢ i + (n + 1)! < (i + n + 1)!
[PROOFSTEP]
apply add_factorial_succ_lt_factorial_add_succ
[GOAL]
case inl.h.hi
m n✝ i n : ℕ
h✝ : 2 ≤ i
⊢ 2 ≤ i
[PROOFSTEP]
assumption
[GOAL]
case inr
m n✝ i n : ℕ
h✝ : i < 2
⊢ i + (n + 1)! ≤ (i + (n + 1))!
[PROOFSTEP]
match i with
| 0 => simp
|
1 =>
  rw [← add_assoc, ← Nat.succ_eq_add_one (1 + n), factorial_succ (1 + n), add_mul, one_mul, add_comm 1 n,
    add_le_add_iff_right]
  apply one_le_mul
  · apply Nat.le_add_left
  · apply factorial_pos
| succ (succ n) => contradiction
[GOAL]
m n✝ i n : ℕ
h✝ : 0 < 2
⊢ 0 + (n + 1)! ≤ (0 + (n + 1))!
[PROOFSTEP]
simp
[GOAL]
m n✝ i n : ℕ
h✝ : 1 < 2
⊢ 1 + (n + 1)! ≤ (1 + (n + 1))!
[PROOFSTEP]
rw [← add_assoc, ← Nat.succ_eq_add_one (1 + n), factorial_succ (1 + n), add_mul, one_mul, add_comm 1 n,
  add_le_add_iff_right]
[GOAL]
m n✝ i n : ℕ
h✝ : 1 < 2
⊢ 1 ≤ (n + 1) * (n + 1)!
[PROOFSTEP]
apply one_le_mul
[GOAL]
case ha
m n✝ i n : ℕ
h✝ : 1 < 2
⊢ 1 ≤ n + 1
[PROOFSTEP]
apply Nat.le_add_left
[GOAL]
case hb
m n✝ i n : ℕ
h✝ : 1 < 2
⊢ 1 ≤ (n + 1)!
[PROOFSTEP]
apply factorial_pos
[GOAL]
m n✝¹ i n✝ n : ℕ
h✝ : succ (succ n) < 2
⊢ succ (succ n) + (n✝ + 1)! ≤ (succ (succ n) + (n✝ + 1))!
[PROOFSTEP]
contradiction
[GOAL]
m n✝ i n : ℕ
n1 : 1 ≤ n
⊢ i + n ! ≤ (i + n)!
[PROOFSTEP]
cases' n1 with h
[GOAL]
case refl
m n i : ℕ
⊢ i + 1! ≤ (i + 1)!
[PROOFSTEP]
exact self_le_factorial _
[GOAL]
case step
m n i h : ℕ
a✝ : Nat.le 1 h
⊢ i + (succ h)! ≤ (i + succ h)!
[PROOFSTEP]
exact add_factorial_succ_le_factorial_add_succ i h
[GOAL]
m✝ n✝ n m : ℕ
hnm : n ≤ m
⊢ n ! * n ^ (m - n) ≤ m !
[PROOFSTEP]
suffices n ! * (n + 1) ^ (m - n) ≤ m ! from by
  apply LE.le.trans _ this
  apply mul_le_mul_left
  apply pow_le_pow_of_le_left (le_succ n)
[GOAL]
m✝ n✝ n m : ℕ
hnm : n ≤ m
this : n ! * (n + 1) ^ (m - n) ≤ m !
⊢ n ! * n ^ (m - n) ≤ m !
[PROOFSTEP]
apply LE.le.trans _ this
[GOAL]
m✝ n✝ n m : ℕ
hnm : n ≤ m
this : n ! * (n + 1) ^ (m - n) ≤ m !
⊢ n ! * n ^ (m - n) ≤ n ! * (n + 1) ^ (m - n)
[PROOFSTEP]
apply mul_le_mul_left
[GOAL]
case h
m✝ n✝ n m : ℕ
hnm : n ≤ m
this : n ! * (n + 1) ^ (m - n) ≤ m !
⊢ n ^ (m - n) ≤ (n + 1) ^ (m - n)
[PROOFSTEP]
apply pow_le_pow_of_le_left (le_succ n)
[GOAL]
m✝ n✝ n m : ℕ
hnm : n ≤ m
⊢ n ! * (n + 1) ^ (m - n) ≤ m !
[PROOFSTEP]
have := @Nat.factorial_mul_pow_le_factorial n (m - n)
[GOAL]
m✝ n✝ n m : ℕ
hnm : n ≤ m
this : n ! * succ n ^ (m - n) ≤ (n + (m - n))!
⊢ n ! * (n + 1) ^ (m - n) ≤ m !
[PROOFSTEP]
simp [hnm] at this
[GOAL]
m✝ n✝ n m : ℕ
hnm : n ≤ m
this : n ! * succ n ^ (m - n) ≤ m !
⊢ n ! * (n + 1) ^ (m - n) ≤ m !
[PROOFSTEP]
exact this
[GOAL]
k : ℕ
⊢ ascFactorial 0 k = k !
[PROOFSTEP]
induction' k with t ht
[GOAL]
case zero
⊢ ascFactorial 0 zero = zero !
[PROOFSTEP]
rfl
[GOAL]
case succ
t : ℕ
ht : ascFactorial 0 t = t !
⊢ ascFactorial 0 (succ t) = (succ t)!
[PROOFSTEP]
rw [ascFactorial, ht, zero_add, Nat.factorial_succ]
[GOAL]
n : ℕ
⊢ (n + 1) * ascFactorial (succ n) 0 = (n + 0 + 1) * ascFactorial n 0
[PROOFSTEP]
rw [add_zero, ascFactorial_zero, ascFactorial_zero]
[GOAL]
n k : ℕ
⊢ (n + 1) * ascFactorial (succ n) (k + 1) = (n + (k + 1) + 1) * ascFactorial n (k + 1)
[PROOFSTEP]
rw [ascFactorial, mul_left_comm, succ_ascFactorial n k, ascFactorial, succ_add, ← add_assoc, succ_eq_add_one]
[GOAL]
n : ℕ
⊢ n ! * ascFactorial n 0 = (n + 0)!
[PROOFSTEP]
rw [ascFactorial, add_zero, mul_one]
[GOAL]
n k : ℕ
⊢ n ! * ascFactorial n (k + 1) = (n + (k + 1))!
[PROOFSTEP]
rw [ascFactorial_succ, mul_left_comm, factorial_mul_ascFactorial n k, ← add_assoc, ← Nat.succ_eq_add_one (n + k),
  factorial]
[GOAL]
n k : ℕ
⊢ ascFactorial n k = (n + k)! / n !
[PROOFSTEP]
apply mul_left_cancel₀ n.factorial_ne_zero
[GOAL]
n k : ℕ
⊢ n ! * ascFactorial n k = n ! * ((n + k)! / n !)
[PROOFSTEP]
rw [factorial_mul_ascFactorial]
[GOAL]
n k : ℕ
⊢ (n + k)! = n ! * ((n + k)! / n !)
[PROOFSTEP]
exact (Nat.mul_div_cancel' <| factorial_dvd_factorial <| le.intro rfl).symm
[GOAL]
n k : ℕ
h : k < n
⊢ (n - k) * ascFactorial (n - k) k = ascFactorial (n - (k + 1)) (k + 1)
[PROOFSTEP]
let t := n - k.succ
[GOAL]
n k : ℕ
h : k < n
t : ℕ := n - succ k
⊢ (n - k) * ascFactorial (n - k) k = ascFactorial (n - (k + 1)) (k + 1)
[PROOFSTEP]
let ht : t = n - k.succ := rfl
[GOAL]
n k : ℕ
h : k < n
t : ℕ := n - succ k
ht : t = n - succ k := rfl
⊢ (n - k) * ascFactorial (n - k) k = ascFactorial (n - (k + 1)) (k + 1)
[PROOFSTEP]
suffices h' : n - k = t.succ
[GOAL]
n k : ℕ
h : k < n
t : ℕ := n - succ k
ht : t = n - succ k := rfl
h' : n - k = succ t
⊢ (n - k) * ascFactorial (n - k) k = ascFactorial (n - (k + 1)) (k + 1)
[PROOFSTEP]
rw [← ht, h', succ_ascFactorial, ascFactorial_succ]
[GOAL]
case h'
n k : ℕ
h : k < n
t : ℕ := n - succ k
ht : t = n - succ k := rfl
⊢ n - k = succ t
[PROOFSTEP]
rw [ht, succ_eq_add_one, ← tsub_tsub_assoc (succ_le_of_lt h) (succ_pos _), succ_sub_one]
[GOAL]
n : ℕ
⊢ (n + 1) ^ 0 ≤ ascFactorial n 0
[PROOFSTEP]
rw [ascFactorial_zero, pow_zero]
[GOAL]
n k : ℕ
⊢ (n + 1) ^ (k + 1) ≤ ascFactorial n (k + 1)
[PROOFSTEP]
rw [pow_succ, mul_comm]
[GOAL]
n k : ℕ
⊢ (n + 1) * (n + 1) ^ k ≤ ascFactorial n (k + 1)
[PROOFSTEP]
exact Nat.mul_le_mul (Nat.add_le_add_right le_self_add _) (pow_succ_le_ascFactorial _ k)
[GOAL]
n k : ℕ
⊢ (n + 1) ^ (k + 2) < ascFactorial n (k + 2)
[PROOFSTEP]
rw [pow_succ, ascFactorial, mul_comm]
[GOAL]
n k : ℕ
⊢ (n + 1) * (n + 1) ^ (k + 1) < (n + (k + 1) + 1) * ascFactorial n (k + 1)
[PROOFSTEP]
exact
  Nat.mul_lt_mul (Nat.add_lt_add_right (Nat.lt_add_of_pos_right succ_pos') 1) (pow_succ_le_ascFactorial n _)
    (pow_pos succ_pos' _)
[GOAL]
n : ℕ
⊢ 2 ≤ 0 → (n + 1) ^ 0 < ascFactorial n 0
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
n : ℕ
⊢ 2 ≤ 1 → (n + 1) ^ 1 < ascFactorial n 1
[PROOFSTEP]
intro
[GOAL]
n : ℕ
a✝ : 2 ≤ 1
⊢ (n + 1) ^ 1 < ascFactorial n 1
[PROOFSTEP]
contradiction
[GOAL]
n : ℕ
⊢ ascFactorial n 0 ≤ (n + 0) ^ 0
[PROOFSTEP]
rw [ascFactorial_zero, pow_zero]
[GOAL]
n k : ℕ
⊢ ascFactorial n (k + 1) ≤ (n + (k + 1)) ^ (k + 1)
[PROOFSTEP]
rw [ascFactorial_succ, pow_succ, ← add_assoc, ← Nat.succ_eq_add_one (n + k), mul_comm _ (succ (n + k))]
[GOAL]
n k : ℕ
⊢ succ (n + k) * ascFactorial n k ≤ succ (n + k) * succ (n + k) ^ k
[PROOFSTEP]
exact Nat.mul_le_mul_of_nonneg_left ((ascFactorial_le_pow_add _ k).trans (Nat.pow_le_pow_of_le_left (le_succ _) _))
[GOAL]
n : ℕ
⊢ 2 ≤ 0 → ascFactorial n 0 < (n + 0) ^ 0
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
n : ℕ
⊢ 2 ≤ 1 → ascFactorial n 1 < (n + 1) ^ 1
[PROOFSTEP]
intro
[GOAL]
n : ℕ
a✝ : 2 ≤ 1
⊢ ascFactorial n 1 < (n + 1) ^ 1
[PROOFSTEP]
contradiction
[GOAL]
n k : ℕ
x✝ : 2 ≤ k + 2
⊢ ascFactorial n (k + 2) < (n + (k + 2)) ^ (k + 2)
[PROOFSTEP]
rw [ascFactorial_succ, pow_succ]
[GOAL]
n k : ℕ
x✝ : 2 ≤ k + 2
⊢ (n + (k + 1) + 1) * ascFactorial n (k + 1) < (n + (k + 2)) ^ (k + 1) * (n + (k + 2))
[PROOFSTEP]
rw [add_assoc n (k + 1) 1, mul_comm <| (n + (k + 2)) ^ (k + 1)]
[GOAL]
n k : ℕ
x✝ : 2 ≤ k + 2
⊢ (n + (k + 1 + 1)) * ascFactorial n (k + 1) < (n + (k + 2)) * (n + (k + 2)) ^ (k + 1)
[PROOFSTEP]
refine'
  Nat.mul_lt_mul' le_rfl ((ascFactorial_le_pow_add n _).trans_lt (pow_lt_pow_of_lt_left (lt_add_one _) (succ_pos _)))
    (succ_pos _)
[GOAL]
k : ℕ
⊢ descFactorial 0 (succ k) = 0
[PROOFSTEP]
rw [descFactorial_succ, zero_tsub, zero_mul]
[GOAL]
n : ℕ
⊢ descFactorial n 1 = n
[PROOFSTEP]
rw [descFactorial_succ, descFactorial_zero, mul_one, tsub_zero]
[GOAL]
n : ℕ
⊢ descFactorial (n + 1) (0 + 1) = (n + 1) * descFactorial n 0
[PROOFSTEP]
rw [descFactorial_zero, descFactorial_one, mul_one]
[GOAL]
n k : ℕ
⊢ descFactorial (n + 1) (succ k + 1) = (n + 1) * descFactorial n (succ k)
[PROOFSTEP]
rw [descFactorial_succ, succ_descFactorial_succ _ k, descFactorial_succ, succ_sub_succ, mul_left_comm]
[GOAL]
n : ℕ
⊢ (n + 1 - 0) * descFactorial (n + 1) 0 = (n + 1) * descFactorial n 0
[PROOFSTEP]
rw [tsub_zero, descFactorial_zero, descFactorial_zero]
[GOAL]
n k : ℕ
⊢ (n + 1 - (k + 1)) * descFactorial (n + 1) (k + 1) = (n + 1) * descFactorial n (k + 1)
[PROOFSTEP]
rw [descFactorial, succ_descFactorial _ k, descFactorial_succ, succ_sub_succ, mul_left_comm]
[GOAL]
⊢ descFactorial 0 0 = 0!
[PROOFSTEP]
rw [descFactorial_zero, factorial_zero]
[GOAL]
n : ℕ
⊢ descFactorial (succ n) (succ n) = (succ n)!
[PROOFSTEP]
rw [succ_descFactorial_succ, descFactorial_self n, factorial_succ]
[GOAL]
n : ℕ
⊢ descFactorial n 0 = 0 ↔ n < 0
[PROOFSTEP]
simp only [descFactorial_zero, Nat.one_ne_zero, Nat.not_lt_zero]
[GOAL]
n k : ℕ
⊢ descFactorial n (succ k) = 0 ↔ n < succ k
[PROOFSTEP]
rw [descFactorial_succ, mul_eq_zero, descFactorial_eq_zero_iff_lt, lt_succ_iff, tsub_eq_zero_iff_le, lt_iff_le_and_ne,
  or_iff_left_iff_imp, and_imp]
[GOAL]
n k : ℕ
⊢ n ≤ k → n ≠ k → n ≤ k
[PROOFSTEP]
exact fun h _ => h
[GOAL]
n : ℕ
⊢ descFactorial (n + 0) 0 = ascFactorial n 0
[PROOFSTEP]
rw [ascFactorial_zero, descFactorial_zero]
[GOAL]
n k : ℕ
⊢ descFactorial (n + succ k) (succ k) = ascFactorial n (succ k)
[PROOFSTEP]
rw [Nat.add_succ, Nat.succ_eq_add_one, Nat.succ_eq_add_one, succ_descFactorial_succ, ascFactorial_succ,
  add_descFactorial_eq_ascFactorial _ k]
[GOAL]
n : ℕ
x✝ : 0 ≤ n
⊢ (n - 0)! * descFactorial n 0 = n !
[PROOFSTEP]
rw [descFactorial_zero, mul_one, tsub_zero]
[GOAL]
k : ℕ
h : succ k ≤ 0
⊢ (0 - succ k)! * descFactorial 0 (succ k) = 0!
[PROOFSTEP]
exfalso
[GOAL]
case h
k : ℕ
h : succ k ≤ 0
⊢ False
[PROOFSTEP]
exact not_succ_le_zero k h
[GOAL]
n k : ℕ
h : succ k ≤ succ n
⊢ (succ n - succ k)! * descFactorial (succ n) (succ k) = (succ n)!
[PROOFSTEP]
rw [succ_descFactorial_succ, succ_sub_succ, ← mul_assoc, mul_comm (n - k)!, mul_assoc,
  factorial_mul_descFactorial (Nat.succ_le_succ_iff.1 h), factorial_succ]
[GOAL]
n k : ℕ
h : k ≤ n
⊢ descFactorial n k = n ! / (n - k)!
[PROOFSTEP]
apply mul_left_cancel₀ (factorial_ne_zero (n - k))
[GOAL]
n k : ℕ
h : k ≤ n
⊢ (n - k)! * descFactorial n k = (n - k)! * (n ! / (n - k)!)
[PROOFSTEP]
rw [factorial_mul_descFactorial h]
[GOAL]
n k : ℕ
h : k ≤ n
⊢ n ! = (n - k)! * (n ! / (n - k)!)
[PROOFSTEP]
exact (Nat.mul_div_cancel' <| factorial_dvd_factorial <| Nat.sub_le n k).symm
[GOAL]
n : ℕ
⊢ (n + 1 - 0) ^ 0 ≤ descFactorial n 0
[PROOFSTEP]
rw [descFactorial_zero, pow_zero]
[GOAL]
n k : ℕ
⊢ (n + 1 - (k + 1)) ^ (k + 1) ≤ descFactorial n (k + 1)
[PROOFSTEP]
rw [descFactorial_succ, pow_succ, succ_sub_succ, mul_comm]
[GOAL]
n k : ℕ
⊢ (n - k) * (n - k) ^ k ≤ (n - k) * descFactorial n k
[PROOFSTEP]
apply Nat.mul_le_mul_of_nonneg_left
[GOAL]
case h₁
n k : ℕ
⊢ (n - k) ^ k ≤ descFactorial n k
[PROOFSTEP]
exact (le_trans (Nat.pow_le_pow_of_le_left (tsub_le_tsub_right (le_succ _) _) k) (pow_sub_le_descFactorial n k))
[GOAL]
n : ℕ
h : 0 + 2 ≤ n
⊢ (n - (0 + 1)) ^ (0 + 2) < descFactorial n (0 + 2)
[PROOFSTEP]
rw [descFactorial_succ, pow_succ, pow_one, descFactorial_one]
[GOAL]
n : ℕ
h : 0 + 2 ≤ n
⊢ (n - (0 + 1)) * (n - (0 + 1)) < (n - 1) * n
[PROOFSTEP]
exact Nat.mul_lt_mul_of_pos_left (tsub_lt_self (lt_of_lt_of_le zero_lt_two h) zero_lt_one) (tsub_pos_of_lt h)
[GOAL]
n k : ℕ
h : k + 1 + 2 ≤ n
⊢ (n - (k + 1 + 1)) ^ (k + 1 + 2) < descFactorial n (k + 1 + 2)
[PROOFSTEP]
rw [descFactorial_succ, pow_succ, mul_comm]
[GOAL]
n k : ℕ
h : k + 1 + 2 ≤ n
⊢ (n - (k + 1 + 1)) * (n - (k + 1 + 1)) ^ (k + 2) < (n - (k + 2)) * descFactorial n (k + 2)
[PROOFSTEP]
apply Nat.mul_lt_mul_of_pos_left
[GOAL]
case h
n k : ℕ
h : k + 1 + 2 ≤ n
⊢ (n - (k + 1 + 1)) ^ (k + 2) < descFactorial n (k + 2)
[PROOFSTEP]
refine' ((Nat.pow_le_pow_of_le_left (tsub_le_tsub_right (le_succ n) _) _).trans_lt _)
[GOAL]
case h
n k : ℕ
h : k + 1 + 2 ≤ n
⊢ (succ n - (k + 1 + 1)) ^ (k + 2) < descFactorial n (k + 2)
[PROOFSTEP]
rw [succ_sub_succ]
[GOAL]
case h
n k : ℕ
h : k + 1 + 2 ≤ n
⊢ (n - (k + 1)) ^ (k + 2) < descFactorial n (k + 2)
[PROOFSTEP]
exact pow_sub_lt_descFactorial' ((le_succ _).trans h)
[GOAL]
case hk
n k : ℕ
h : k + 1 + 2 ≤ n
⊢ n - (k + 1 + 1) > 0
[PROOFSTEP]
apply tsub_pos_of_lt
[GOAL]
case hk.h
n k : ℕ
h : k + 1 + 2 ≤ n
⊢ k + 1 + 1 < n
[PROOFSTEP]
apply h
[GOAL]
n : ℕ
⊢ 2 ≤ 0 → 0 ≤ n → (n + 1 - 0) ^ 0 < descFactorial n 0
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
n : ℕ
⊢ 2 ≤ 1 → 1 ≤ n → (n + 1 - 1) ^ 1 < descFactorial n 1
[PROOFSTEP]
intro
[GOAL]
n : ℕ
a✝ : 2 ≤ 1
⊢ 1 ≤ n → (n + 1 - 1) ^ 1 < descFactorial n 1
[PROOFSTEP]
contradiction
[GOAL]
n k : ℕ
x✝ : 2 ≤ k + 2
h : k + 2 ≤ n
⊢ (n + 1 - (k + 2)) ^ (k + 2) < descFactorial n (k + 2)
[PROOFSTEP]
rw [succ_sub_succ]
[GOAL]
n k : ℕ
x✝ : 2 ≤ k + 2
h : k + 2 ≤ n
⊢ (n - (k + 1)) ^ (k + 2) < descFactorial n (k + 2)
[PROOFSTEP]
exact pow_sub_lt_descFactorial' h
[GOAL]
n : ℕ
⊢ descFactorial n 0 ≤ n ^ 0
[PROOFSTEP]
rw [descFactorial_zero, pow_zero]
[GOAL]
n k : ℕ
⊢ descFactorial n (k + 1) ≤ n ^ (k + 1)
[PROOFSTEP]
rw [descFactorial_succ, pow_succ, mul_comm _ n]
[GOAL]
n k : ℕ
⊢ (n - k) * descFactorial n k ≤ n * n ^ k
[PROOFSTEP]
exact Nat.mul_le_mul (Nat.sub_le _ _) (descFactorial_le_pow _ k)
[GOAL]
n : ℕ
hn : 1 ≤ n
⊢ 2 ≤ 0 → descFactorial n 0 < n ^ 0
[PROOFSTEP]
rintro ⟨⟩
[GOAL]
n : ℕ
hn : 1 ≤ n
⊢ 2 ≤ 1 → descFactorial n 1 < n ^ 1
[PROOFSTEP]
intro
[GOAL]
n : ℕ
hn : 1 ≤ n
a✝ : 2 ≤ 1
⊢ descFactorial n 1 < n ^ 1
[PROOFSTEP]
contradiction
[GOAL]
n : ℕ
hn : 1 ≤ n
k : ℕ
x✝ : 2 ≤ k + 2
⊢ descFactorial n (k + 2) < n ^ (k + 2)
[PROOFSTEP]
rw [descFactorial_succ, pow_succ', mul_comm, mul_comm n]
[GOAL]
n : ℕ
hn : 1 ≤ n
k : ℕ
x✝ : 2 ≤ k + 2
⊢ descFactorial n (k + 1) * (n - (k + 1)) < n ^ (k + 1) * n
[PROOFSTEP]
exact Nat.mul_lt_mul' (descFactorial_le_pow _ _) (tsub_lt_self hn k.zero_lt_succ) (pow_pos (Nat.lt_of_succ_le hn) _)


[GOAL]
α : Type u_1
inst✝ : CommRing α
n1 n2 k e1 e2 t1 t2 : α
h1 : n1 * e1 = t1
h2 : n2 * e2 = t2
h3 : n1 * n2 = k
⊢ k * (e1 * e2) = t1 * t2
[PROOFSTEP]
rw [← h3, mul_comm n1, mul_assoc n2, ← mul_assoc n1, h1, ← mul_assoc n2, mul_comm n2, mul_assoc, h2]
[GOAL]
α : Type u_1
inst✝ : Field α
n1 n2 k e1 e2 t1 : α
h1 : n1 * e1 = t1
h2 : n2 / e2 = 1
h3 : n1 * n2 = k
⊢ k * (e1 / e2) = t1
[PROOFSTEP]
rw [← h3, mul_assoc, mul_div_left_comm, h2, ← mul_assoc, h1, mul_comm, one_mul]
[GOAL]
α : Type u_1
inst✝ : Field α
n e e' : α
h : n * e = e'
h2 : n ≠ 0
⊢ e * n = e'
[PROOFSTEP]
rwa [mul_comm] at h
[GOAL]
α : Type u_1
inst✝ : Ring α
n e1 e2 t1 t2 : α
h1 : n * e1 = t1
h2 : n * e2 = t2
⊢ n * (e1 + e2) = t1 + t2
[PROOFSTEP]
simp [left_distrib, *]
[GOAL]
α : Type u_1
inst✝ : Ring α
n e1 e2 t1 t2 : α
h1 : n * e1 = t1
h2 : n * e2 = t2
⊢ n * (e1 - e2) = t1 - t2
[PROOFSTEP]
simp [left_distrib, *, sub_eq_add_neg]
[GOAL]
α : Type u_1
inst✝ : Ring α
n e t : α
h1 : n * e = t
⊢ n * -e = -t
[PROOFSTEP]
simp [*]
[GOAL]
α : Type u_1
inst✝ : LinearOrderedField α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : 0 < ad
hbd : 0 < bd
hgcd : 0 < gcd
⊢ (a < b) = (1 / gcd * (bd * a') < 1 / gcd * (ad * b'))
[PROOFSTEP]
rw [mul_lt_mul_left, ← ha, ← hb, ← mul_assoc, ← mul_assoc, mul_comm bd, mul_lt_mul_left]
[GOAL]
α : Type u_1
inst✝ : LinearOrderedField α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : 0 < ad
hbd : 0 < bd
hgcd : 0 < gcd
⊢ 0 < ad * bd
[PROOFSTEP]
exact mul_pos had hbd
[GOAL]
α : Type u_1
inst✝ : LinearOrderedField α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : 0 < ad
hbd : 0 < bd
hgcd : 0 < gcd
⊢ 0 < 1 / gcd
[PROOFSTEP]
exact one_div_pos.2 hgcd
[GOAL]
α : Type u_1
inst✝ : LinearOrderedField α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : 0 < ad
hbd : 0 < bd
hgcd : 0 < gcd
⊢ (a ≤ b) = (1 / gcd * (bd * a') ≤ 1 / gcd * (ad * b'))
[PROOFSTEP]
rw [mul_le_mul_left, ← ha, ← hb, ← mul_assoc, ← mul_assoc, mul_comm bd, mul_le_mul_left]
[GOAL]
α : Type u_1
inst✝ : LinearOrderedField α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : 0 < ad
hbd : 0 < bd
hgcd : 0 < gcd
⊢ 0 < ad * bd
[PROOFSTEP]
exact mul_pos had hbd
[GOAL]
α : Type u_1
inst✝ : LinearOrderedField α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : 0 < ad
hbd : 0 < bd
hgcd : 0 < gcd
⊢ 0 < 1 / gcd
[PROOFSTEP]
exact one_div_pos.2 hgcd
[GOAL]
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
⊢ (a = b) = (1 / gcd * (bd * a') = 1 / gcd * (ad * b'))
[PROOFSTEP]
rw [← ha, ← hb, ← mul_assoc bd, ← mul_assoc ad, mul_comm bd]
[GOAL]
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
⊢ (a = b) = (1 / gcd * (ad * bd * a) = 1 / gcd * (ad * bd * b))
[PROOFSTEP]
ext
[GOAL]
case a
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
⊢ a = b ↔ 1 / gcd * (ad * bd * a) = 1 / gcd * (ad * bd * b)
[PROOFSTEP]
constructor
[GOAL]
case a.mp
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
⊢ a = b → 1 / gcd * (ad * bd * a) = 1 / gcd * (ad * bd * b)
[PROOFSTEP]
rintro rfl
[GOAL]
case a.mp
α : Type u_1
inst✝ : Field α
a ad bd a' b' gcd : α
ha : ad * a = a'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
hb : bd * a = b'
⊢ 1 / gcd * (ad * bd * a) = 1 / gcd * (ad * bd * a)
[PROOFSTEP]
rfl
[GOAL]
case a.mpr
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
⊢ 1 / gcd * (ad * bd * a) = 1 / gcd * (ad * bd * b) → a = b
[PROOFSTEP]
intro h
[GOAL]
case a.mpr
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * (ad * bd * a) = 1 / gcd * (ad * bd * b)
⊢ a = b
[PROOFSTEP]
simp only [← mul_assoc] at h
[GOAL]
case a.mpr
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ a = b
[PROOFSTEP]
refine' mul_left_cancel₀ (mul_ne_zero _ _) h
[GOAL]
case a.mpr.refine'_1
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ 1 / gcd * ad ≠ 0
case a.mpr.refine'_2
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ bd ≠ 0
[PROOFSTEP]
apply mul_ne_zero
[GOAL]
case a.mpr.refine'_1.ha
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ 1 / gcd ≠ 0
case a.mpr.refine'_1.hb
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ ad ≠ 0
case a.mpr.refine'_2
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ bd ≠ 0
[PROOFSTEP]
apply div_ne_zero
[GOAL]
case a.mpr.refine'_1.ha.ha
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ 1 ≠ 0
case a.mpr.refine'_1.ha.hb
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ gcd ≠ 0
case a.mpr.refine'_1.hb
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ ad ≠ 0
case a.mpr.refine'_2
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ bd ≠ 0
[PROOFSTEP]
exact one_ne_zero
[GOAL]
case a.mpr.refine'_1.ha.hb
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ gcd ≠ 0
case a.mpr.refine'_1.hb
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ ad ≠ 0
case a.mpr.refine'_2
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ bd ≠ 0
[PROOFSTEP]
all_goals assumption
[GOAL]
case a.mpr.refine'_1.ha.hb
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ gcd ≠ 0
[PROOFSTEP]
assumption
[GOAL]
case a.mpr.refine'_1.hb
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ ad ≠ 0
[PROOFSTEP]
assumption
[GOAL]
case a.mpr.refine'_2
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
h : 1 / gcd * ad * bd * a = 1 / gcd * ad * bd * b
⊢ bd ≠ 0
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
⊢ (a ≠ b) = (1 / gcd * (bd * a') ≠ 1 / gcd * (ad * b'))
[PROOFSTEP]
classical rw [eq_iff_iff, not_iff_not, cancel_factors_eq ha hb had hbd hgcd]
[GOAL]
α : Type u_1
inst✝ : Field α
a b ad bd a' b' gcd : α
ha : ad * a = a'
hb : bd * b = b'
had : ad ≠ 0
hbd : bd ≠ 0
hgcd : gcd ≠ 0
⊢ (a ≠ b) = (1 / gcd * (bd * a') ≠ 1 / gcd * (ad * b'))
[PROOFSTEP]
rw [eq_iff_iff, not_iff_not, cancel_factors_eq ha hb had hbd hgcd]


[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
x✝ : Set C(α, β)
⊢ x✝ ∈ {m | ∃ s x u x, m = CompactOpen.gen s u} ↔ x✝ ∈ image2 CompactOpen.gen {s | IsCompact s} {t | IsOpen t}
[PROOFSTEP]
simp [eq_comm]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
⊢ CompactOpen.gen s u ∈ {m | ∃ s x u x, m = CompactOpen.gen s u}
[PROOFSTEP]
dsimp [mem_setOf_eq]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
⊢ ∃ s_1 x u_1 x, CompactOpen.gen s u = CompactOpen.gen s_1 u_1
[PROOFSTEP]
tauto
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
s : Set α
u : Set γ
⊢ comp g ⁻¹' CompactOpen.gen s u = CompactOpen.gen s (↑g ⁻¹' u)
[PROOFSTEP]
ext ⟨f, _⟩
[GOAL]
case h.mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
s : Set α
u : Set γ
f : α → β
continuous_toFun✝ : Continuous f
⊢ mk f ∈ comp g ⁻¹' CompactOpen.gen s u ↔ mk f ∈ CompactOpen.gen s (↑g ⁻¹' u)
[PROOFSTEP]
change g ∘ f '' s ⊆ u ↔ f '' s ⊆ g ⁻¹' u
[GOAL]
case h.mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
s : Set α
u : Set γ
f : α → β
continuous_toFun✝ : Continuous f
⊢ ↑g ∘ f '' s ⊆ u ↔ f '' s ⊆ ↑g ⁻¹' u
[PROOFSTEP]
rw [image_comp, image_subset_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
m : Set C(α, γ)
x✝ : m ∈ {m | ∃ s x u x, m = CompactOpen.gen s u}
s : Set α
hs : IsCompact s
u : Set γ
hu : IsOpen u
hm : m = CompactOpen.gen s u
⊢ IsOpen (comp g ⁻¹' m)
[PROOFSTEP]
rw [hm, preimage_gen g]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
m : Set C(α, γ)
x✝ : m ∈ {m | ∃ s x u x, m = CompactOpen.gen s u}
s : Set α
hs : IsCompact s
u : Set γ
hu : IsOpen u
hm : m = CompactOpen.gen s u
⊢ IsOpen (CompactOpen.gen s (↑g ⁻¹' u))
[PROOFSTEP]
exact ContinuousMap.isOpen_gen hs (hu.preimage g.2)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
hg : Inducing ↑g
⊢ compactOpen = TopologicalSpace.induced (comp g) compactOpen
[PROOFSTEP]
simp only [compactOpen_eq, induced_generateFrom_eq, image_image2, preimage_gen, hg.setOf_isOpen, image2_image_right]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
s : Set α
x✝¹ : IsCompact s
u : Set γ
x✝ : IsOpen u
⊢ (fun g => comp g f) ⁻¹' CompactOpen.gen s u = CompactOpen.gen (↑f '' s) u
[PROOFSTEP]
ext ⟨g, _⟩
[GOAL]
case h.mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g✝ : C(β, γ)
f : C(α, β)
s : Set α
x✝¹ : IsCompact s
u : Set γ
x✝ : IsOpen u
g : β → γ
continuous_toFun✝ : Continuous g
⊢ mk g ∈ (fun g => comp g f) ⁻¹' CompactOpen.gen s u ↔ mk g ∈ CompactOpen.gen (↑f '' s) u
[PROOFSTEP]
change g ∘ f '' s ⊆ u ↔ g '' (f '' s) ⊆ u
[GOAL]
case h.mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g✝ : C(β, γ)
f : C(α, β)
s : Set α
x✝¹ : IsCompact s
u : Set γ
x✝ : IsOpen u
g : β → γ
continuous_toFun✝ : Continuous g
⊢ g ∘ ↑f '' s ⊆ u ↔ g '' (↑f '' s) ⊆ u
[PROOFSTEP]
rw [Set.image_comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
m : Set C(α, γ)
x✝ : m ∈ {m | ∃ s x u x, m = CompactOpen.gen s u}
s : Set α
hs : IsCompact s
u : Set γ
hu : IsOpen u
hm : m = CompactOpen.gen s u
⊢ IsOpen ((fun g => comp g f) ⁻¹' m)
[PROOFSTEP]
rw [hm, image_gen f hs hu]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
m : Set C(α, γ)
x✝ : m ∈ {m | ∃ s x u x, m = CompactOpen.gen s u}
s : Set α
hs : IsCompact s
u : Set γ
hu : IsOpen u
hm : m = CompactOpen.gen s u
⊢ IsOpen (CompactOpen.gen (↑f '' s) u)
[PROOFSTEP]
exact ContinuousMap.isOpen_gen (hs.image f.2) hu
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
⊢ ∀ (s : Set C(α, γ)), s ∈ {m | ∃ s x u x, m = CompactOpen.gen s u} → IsOpen ((fun x => comp x.snd x.fst) ⁻¹' s)
[PROOFSTEP]
rintro M ⟨K, hK, U, hU, rfl⟩
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
⊢ IsOpen ((fun x => comp x.snd x.fst) ⁻¹' CompactOpen.gen K U)
[PROOFSTEP]
conv =>
  congr
  rw [CompactOpen.gen, preimage_setOf_eq]
    --congr
  ext; dsimp [setOf]
  rw [image_comp, image_subset_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
| IsOpen ((fun x => comp x.snd x.fst) ⁻¹' CompactOpen.gen K U)
[PROOFSTEP]
  congr
  rw [CompactOpen.gen, preimage_setOf_eq]
    --congr
  ext; dsimp [setOf]
  rw [image_comp, image_subset_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
| IsOpen ((fun x => comp x.snd x.fst) ⁻¹' CompactOpen.gen K U)
[PROOFSTEP]
  congr
  rw [CompactOpen.gen, preimage_setOf_eq]
    --congr
  ext; dsimp [setOf]
  rw [image_comp, image_subset_iff]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
| IsOpen ((fun x => comp x.snd x.fst) ⁻¹' CompactOpen.gen K U)
[PROOFSTEP]
congr
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
| (fun x => comp x.snd x.fst) ⁻¹' CompactOpen.gen K U
[PROOFSTEP]
rw [CompactOpen.gen, preimage_setOf_eq]
  --congr
[GOAL]
case a
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
| {a | ↑(comp a.snd a.fst) '' K ⊆ U}
[PROOFSTEP]
ext
[GOAL]
case a.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
x✝ : C(α, β) × C(β, γ)
| setOf (fun a => ↑(comp a.snd a.fst) '' K ⊆ U) x✝
[PROOFSTEP]
dsimp [setOf]
[GOAL]
case a.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
x✝ : C(α, β) × C(β, γ)
| ↑x✝.snd ∘ ↑x✝.fst '' K ⊆ U
[PROOFSTEP]
rw [image_comp, image_subset_iff]
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
⊢ IsOpen fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U
[PROOFSTEP]
rw [isOpen_iff_forall_mem_open]
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
⊢ ∀ (x : C(α, β) × C(β, γ)),
    (x ∈ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U) → ∃ t, (t ⊆ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U) ∧ IsOpen t ∧ x ∈ t
[PROOFSTEP]
rintro ⟨φ₀, ψ₀⟩ H
[GOAL]
case intro.intro.intro.intro.mk
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
φ₀ : C(α, β)
ψ₀ : C(β, γ)
H : (φ₀, ψ₀) ∈ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U
⊢ ∃ t, (t ⊆ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U) ∧ IsOpen t ∧ (φ₀, ψ₀) ∈ t
[PROOFSTEP]
obtain ⟨L, hL, hKL, hLU⟩ := exists_compact_between (hK.image φ₀.2) (hU.preimage ψ₀.2) H
[GOAL]
case intro.intro.intro.intro.mk.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
φ₀ : C(α, β)
ψ₀ : C(β, γ)
H : (φ₀, ψ₀) ∈ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U
L : Set β
hL : IsCompact L
hKL : φ₀.toFun '' K ⊆ interior L
hLU : L ⊆ ψ₀.toFun ⁻¹' U
⊢ ∃ t, (t ⊆ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U) ∧ IsOpen t ∧ (φ₀, ψ₀) ∈ t
[PROOFSTEP]
use{φ : C(α, β) | φ '' K ⊆ interior L} ×ˢ
    {ψ : C(β, γ) | ψ '' L ⊆ U}
      -- porting note: typing hint `: φ '' K ⊆ interior L` wasn't previously required
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
φ₀ : C(α, β)
ψ₀ : C(β, γ)
H : (φ₀, ψ₀) ∈ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U
L : Set β
hL : IsCompact L
hKL : φ₀.toFun '' K ⊆ interior L
hLU : L ⊆ ψ₀.toFun ⁻¹' U
⊢ ({φ | ↑φ '' K ⊆ interior L} ×ˢ {ψ | ↑ψ '' L ⊆ U} ⊆ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U) ∧
    IsOpen ({φ | ↑φ '' K ⊆ interior L} ×ˢ {ψ | ↑ψ '' L ⊆ U}) ∧
      (φ₀, ψ₀) ∈ {φ | ↑φ '' K ⊆ interior L} ×ˢ {ψ | ↑ψ '' L ⊆ U}
[PROOFSTEP]
use fun ⟨φ, ψ⟩ ⟨(hφ : φ '' K ⊆ interior L), hψ⟩ => subset_trans hφ (interior_subset.trans <| image_subset_iff.mp hψ)
[GOAL]
case right
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
φ₀ : C(α, β)
ψ₀ : C(β, γ)
H : (φ₀, ψ₀) ∈ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U
L : Set β
hL : IsCompact L
hKL : φ₀.toFun '' K ⊆ interior L
hLU : L ⊆ ψ₀.toFun ⁻¹' U
⊢ IsOpen ({φ | ↑φ '' K ⊆ interior L} ×ˢ {ψ | ↑ψ '' L ⊆ U}) ∧ (φ₀, ψ₀) ∈ {φ | ↑φ '' K ⊆ interior L} ×ˢ {ψ | ↑ψ '' L ⊆ U}
[PROOFSTEP]
use(ContinuousMap.isOpen_gen hK isOpen_interior).prod (ContinuousMap.isOpen_gen hL hU)
[GOAL]
case right
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
g : C(β, γ)
f : C(α, β)
inst✝ : LocallyCompactSpace β
K : Set α
hK : IsCompact K
U : Set γ
hU : IsOpen U
φ₀ : C(α, β)
ψ₀ : C(β, γ)
H : (φ₀, ψ₀) ∈ fun x => ↑x.fst '' K ⊆ ↑x.snd ⁻¹' U
L : Set β
hL : IsCompact L
hKL : φ₀.toFun '' K ⊆ interior L
hLU : L ⊆ ψ₀.toFun ⁻¹' U
⊢ (φ₀, ψ₀) ∈ {φ | ↑φ '' K ⊆ interior L} ×ˢ {ψ | ↑ψ '' L ⊆ U}
[PROOFSTEP]
exact mem_prod.mpr ⟨hKL, image_subset_iff.mpr hLU⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : LocallyCompactSpace α
x✝ : C(α, β) × α
n : Set β
f : C(α, β)
x : α
hn : n ∈ 𝓝 (↑(f, x).fst (f, x).snd)
v : Set β
vn : v ⊆ n
vo : IsOpen v
fxv : ↑(f, x).fst (f, x).snd ∈ v
this✝² : v ∈ 𝓝 (↑f x)
s : Set α
hs : s ∈ 𝓝 x
sv : s ⊆ ↑f ⁻¹' v
sc : IsCompact s
u : Set α
us : u ⊆ s
uo : IsOpen u
xu : x ∈ u
w : Set (C(α, β) × α) := CompactOpen.gen s v ×ˢ u
this✝¹ : w ⊆ (fun p => ↑p.fst p.snd) ⁻¹' n
this✝ : IsOpen w
this : (f, x) ∈ w
⊢ w ⊆ (fun p => ↑p.fst p.snd) ⁻¹' n
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : LocallyCompactSpace α
x✝ : C(α, β) × α
n : Set β
f : C(α, β)
x : α
hn : n ∈ 𝓝 (↑(f, x).fst (f, x).snd)
v : Set β
vn : v ⊆ n
vo : IsOpen v
fxv : ↑(f, x).fst (f, x).snd ∈ v
this✝² : v ∈ 𝓝 (↑f x)
s : Set α
hs : s ∈ 𝓝 x
sv : s ⊆ ↑f ⁻¹' v
sc : IsCompact s
u : Set α
us : u ⊆ s
uo : IsOpen u
xu : x ∈ u
w : Set (C(α, β) × α) := CompactOpen.gen s v ×ˢ u
this✝¹ : w ⊆ (fun p => ↑p.fst p.snd) ⁻¹' n
this✝ : IsOpen w
this : (f, x) ∈ w
⊢ IsOpen w
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : LocallyCompactSpace α
x✝ : C(α, β) × α
n : Set β
f : C(α, β)
x : α
hn : n ∈ 𝓝 (↑(f, x).fst (f, x).snd)
v : Set β
vn : v ⊆ n
vo : IsOpen v
fxv : ↑(f, x).fst (f, x).snd ∈ v
this✝² : v ∈ 𝓝 (↑f x)
s : Set α
hs : s ∈ 𝓝 x
sv : s ⊆ ↑f ⁻¹' v
sc : IsCompact s
u : Set α
us : u ⊆ s
uo : IsOpen u
xu : x ∈ u
w : Set (C(α, β) × α) := CompactOpen.gen s v ×ˢ u
this✝¹ : w ⊆ (fun p => ↑p.fst p.snd) ⁻¹' n
this✝ : IsOpen w
this : (f, x) ∈ w
⊢ (f, x) ∈ w
[PROOFSTEP]
assumption
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
a : α
⊢ Continuous fun f => ↑f a
[PROOFSTEP]
refine continuous_def.2 fun U hU ↦ ?_
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
a : α
U : Set ((fun x => β) a)
hU : IsOpen U
⊢ IsOpen ((fun f => ↑f a) ⁻¹' U)
[PROOFSTEP]
convert ContinuousMap.isOpen_gen (isCompact_singleton (a := a)) hU using 1
[GOAL]
case h.e'_3
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
a : α
U : Set ((fun x => β) a)
hU : IsOpen U
⊢ (fun f => ↑f a) ⁻¹' U = CompactOpen.gen {a} U
[PROOFSTEP]
ext
[GOAL]
case h.e'_3.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
a : α
U : Set ((fun x => β) a)
hU : IsOpen U
x✝ : C(α, β)
⊢ x✝ ∈ (fun f => ↑f a) ⁻¹' U ↔ x✝ ∈ CompactOpen.gen {a} U
[PROOFSTEP]
simp [CompactOpen.gen]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
⊢ compactOpen ≤ TopologicalSpace.induced (restrict s) compactOpen
[PROOFSTEP]
simp only [induced_generateFrom_eq, ContinuousMap.compactOpen]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
⊢ TopologicalSpace.generateFrom {m | ∃ s x u x, m = CompactOpen.gen s u} ≤
    TopologicalSpace.generateFrom (preimage (restrict s) '' {m | ∃ s_1 x u x, m = CompactOpen.gen s_1 u})
[PROOFSTEP]
apply TopologicalSpace.generateFrom_anti
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
⊢ preimage (restrict s) '' {m | ∃ s_1 x u x, m = CompactOpen.gen s_1 u} ⊆ {m | ∃ s x u x, m = CompactOpen.gen s u}
[PROOFSTEP]
rintro b ⟨a, ⟨c, hc, u, hu, rfl⟩, rfl⟩
[GOAL]
case h.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
c : Set ↑s
hc : IsCompact c
u : Set β
hu : IsOpen u
⊢ restrict s ⁻¹' CompactOpen.gen c u ∈ {m | ∃ s x u x, m = CompactOpen.gen s u}
[PROOFSTEP]
refine' ⟨(↑) '' c, hc.image continuous_subtype_val, u, hu, _⟩
[GOAL]
case h.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
c : Set ↑s
hc : IsCompact c
u : Set β
hu : IsOpen u
⊢ restrict s ⁻¹' CompactOpen.gen c u = CompactOpen.gen (Subtype.val '' c) u
[PROOFSTEP]
ext f
[GOAL]
case h.intro.intro.intro.intro.intro.intro.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
c : Set ↑s
hc : IsCompact c
u : Set β
hu : IsOpen u
f : C(α, β)
⊢ f ∈ restrict s ⁻¹' CompactOpen.gen c u ↔ f ∈ CompactOpen.gen (Subtype.val '' c) u
[PROOFSTEP]
simp only [CompactOpen.gen, mem_setOf_eq, mem_preimage, ContinuousMap.coe_restrict]
[GOAL]
case h.intro.intro.intro.intro.intro.intro.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
c : Set ↑s
hc : IsCompact c
u : Set β
hu : IsOpen u
f : C(α, β)
⊢ (fun a => (↑f ∘ Subtype.val) a) '' c ⊆ u ↔ (fun a => ↑f a) '' (Subtype.val '' c) ⊆ u
[PROOFSTEP]
rw [image_comp f ((↑) : s → α)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
⊢ compactOpen = ⨅ (s : Set α) (_ : IsCompact s), TopologicalSpace.induced (restrict s) compactOpen
[PROOFSTEP]
refine' le_antisymm _ _
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
⊢ compactOpen ≤ ⨅ (s : Set α) (_ : IsCompact s), TopologicalSpace.induced (restrict s) compactOpen
[PROOFSTEP]
refine' le_iInf₂ _
[GOAL]
case refine'_1
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
⊢ ∀ (i : Set α), IsCompact i → compactOpen ≤ TopologicalSpace.induced (restrict i) compactOpen
[PROOFSTEP]
exact fun s _ => compactOpen_le_induced s
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
⊢ ⨅ (s : Set α) (_ : IsCompact s), TopologicalSpace.induced (restrict s) compactOpen ≤ compactOpen
[PROOFSTEP]
simp only [← generateFrom_iUnion, induced_generateFrom_eq, ContinuousMap.compactOpen]
[GOAL]
case refine'_2
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
⊢ TopologicalSpace.generateFrom
      (⋃ (i : Set α) (_ : IsCompact i), preimage (restrict i) '' {m | ∃ s x u x, m = CompactOpen.gen s u}) ≤
    TopologicalSpace.generateFrom {m | ∃ s x u x, m = CompactOpen.gen s u}
[PROOFSTEP]
apply TopologicalSpace.generateFrom_anti
[GOAL]
case refine'_2.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
⊢ {m | ∃ s x u x, m = CompactOpen.gen s u} ⊆
    ⋃ (i : Set α) (_ : IsCompact i), preimage (restrict i) '' {m | ∃ s x u x, m = CompactOpen.gen s u}
[PROOFSTEP]
rintro _ ⟨s, hs, u, hu, rfl⟩
[GOAL]
case refine'_2.h.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
⊢ CompactOpen.gen s u ∈
    ⋃ (i : Set α) (_ : IsCompact i), preimage (restrict i) '' {m | ∃ s x u x, m = CompactOpen.gen s u}
[PROOFSTEP]
rw [mem_iUnion₂]
[GOAL]
case refine'_2.h.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
⊢ ∃ i j, CompactOpen.gen s u ∈ preimage (restrict i) '' {m | ∃ s x u x, m = CompactOpen.gen s u}
[PROOFSTEP]
refine' ⟨s, hs, _, ⟨univ, isCompact_iff_isCompact_univ.mp hs, u, hu, rfl⟩, _⟩
[GOAL]
case refine'_2.h.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
⊢ restrict s ⁻¹' CompactOpen.gen univ u = CompactOpen.gen s u
[PROOFSTEP]
ext f
[GOAL]
case refine'_2.h.intro.intro.intro.intro.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
f : C(α, β)
⊢ f ∈ restrict s ⁻¹' CompactOpen.gen univ u ↔ f ∈ CompactOpen.gen s u
[PROOFSTEP]
simp only [CompactOpen.gen, mem_setOf_eq, mem_preimage, ContinuousMap.coe_restrict]
[GOAL]
case refine'_2.h.intro.intro.intro.intro.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
f : C(α, β)
⊢ (fun a => (↑f ∘ Subtype.val) a) '' univ ⊆ u ↔ (fun a => ↑f a) '' s ⊆ u
[PROOFSTEP]
rw [image_comp f ((↑) : s → α)]
[GOAL]
case refine'_2.h.intro.intro.intro.intro.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
hs : IsCompact s
u : Set β
hu : IsOpen u
f : C(α, β)
⊢ ↑f '' (Subtype.val '' univ) ⊆ u ↔ (fun a => ↑f a) '' s ⊆ u
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
⊢ Continuous fun F => restrict s F
[PROOFSTEP]
rw [continuous_iff_le_induced]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
⊢ compactOpen ≤ TopologicalSpace.induced (fun F => restrict s F) compactOpen
[PROOFSTEP]
exact compactOpen_le_induced s
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : C(α, β)
⊢ 𝓝 f = ⨅ (s : Set α) (_ : IsCompact s), Filter.comap (restrict s) (𝓝 (restrict s f))
[PROOFSTEP]
rw [compactOpen_eq_sInf_induced]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : C(α, β)
⊢ 𝓝 f = ⨅ (s : Set α) (_ : IsCompact s), Filter.comap (restrict s) (𝓝 (restrict s f))
[PROOFSTEP]
simp [nhds_iInf, nhds_induced]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
ι : Type u_4
l : Filter ι
F : ι → C(α, β)
f : C(α, β)
⊢ Filter.Tendsto F l (𝓝 f) ↔
    ∀ (s : Set α), IsCompact s → Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (restrict s f))
[PROOFSTEP]
rw [compactOpen_eq_sInf_induced]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
ι : Type u_4
l : Filter ι
F : ι → C(α, β)
f : C(α, β)
⊢ Filter.Tendsto F l (𝓝 f) ↔
    ∀ (s : Set α), IsCompact s → Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (restrict s f))
[PROOFSTEP]
simp [nhds_iInf, nhds_induced, Filter.tendsto_comap_iff, Function.comp]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
⊢ (∃ f, Filter.Tendsto F l (𝓝 f)) ↔ ∀ (s : Set α), IsCompact s → ∃ f, Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 f)
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
⊢ (∃ f, Filter.Tendsto F l (𝓝 f)) → ∀ (s : Set α), IsCompact s → ∃ f, Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 f)
[PROOFSTEP]
rintro ⟨f, hf⟩ s _
[GOAL]
case mp.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : C(α, β)
hf : Filter.Tendsto F l (𝓝 f)
s : Set α
hs✝ : IsCompact s
⊢ ∃ f, Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 f)
[PROOFSTEP]
exact ⟨f.restrict s, tendsto_compactOpen_restrict hf s⟩
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
⊢ (∀ (s : Set α), IsCompact s → ∃ f, Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 f)) → ∃ f, Filter.Tendsto F l (𝓝 f)
[PROOFSTEP]
intro h
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
h : ∀ (s : Set α), IsCompact s → ∃ f, Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 f)
⊢ ∃ f, Filter.Tendsto F l (𝓝 f)
[PROOFSTEP]
choose f hf using h
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
⊢ ∃ f, Filter.Tendsto F l (𝓝 f)
[PROOFSTEP]
have h :
  ∀ (s₁) (hs₁ : IsCompact s₁) (s₂) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    f s₁ hs₁ ⟨x, hxs₁⟩ = f s₂ hs₂ ⟨x, hxs₂⟩ :=
  by
  rintro s₁ hs₁ s₂ hs₂ x hxs₁ hxs₂
  haveI := isCompact_iff_compactSpace.mp hs₁
  haveI := isCompact_iff_compactSpace.mp hs₂
  have h₁ := (continuous_eval_const (⟨x, hxs₁⟩ : s₁)).continuousAt.tendsto.comp (hf s₁ hs₁)
  have h₂ := (continuous_eval_const (⟨x, hxs₂⟩ : s₂)).continuousAt.tendsto.comp (hf s₂ hs₂)
  exact tendsto_nhds_unique h₁ h₂
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
⊢ ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
[PROOFSTEP]
rintro s₁ hs₁ s₂ hs₂ x hxs₁ hxs₂
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
s₁ : Set α
hs₁ : IsCompact s₁
s₂ : Set α
hs₂ : IsCompact s₂
x : α
hxs₁ : x ∈ s₁
hxs₂ : x ∈ s₂
⊢ ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
[PROOFSTEP]
haveI := isCompact_iff_compactSpace.mp hs₁
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
s₁ : Set α
hs₁ : IsCompact s₁
s₂ : Set α
hs₂ : IsCompact s₂
x : α
hxs₁ : x ∈ s₁
hxs₂ : x ∈ s₂
this : CompactSpace ↑s₁
⊢ ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
[PROOFSTEP]
haveI := isCompact_iff_compactSpace.mp hs₂
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
s₁ : Set α
hs₁ : IsCompact s₁
s₂ : Set α
hs₂ : IsCompact s₂
x : α
hxs₁ : x ∈ s₁
hxs₂ : x ∈ s₂
this✝ : CompactSpace ↑s₁
this : CompactSpace ↑s₂
⊢ ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
[PROOFSTEP]
have h₁ := (continuous_eval_const (⟨x, hxs₁⟩ : s₁)).continuousAt.tendsto.comp (hf s₁ hs₁)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
s₁ : Set α
hs₁ : IsCompact s₁
s₂ : Set α
hs₂ : IsCompact s₂
x : α
hxs₁ : x ∈ s₁
hxs₂ : x ∈ s₂
this✝ : CompactSpace ↑s₁
this : CompactSpace ↑s₂
h₁ :
  Filter.Tendsto ((fun f => ↑f { val := x, property := hxs₁ }) ∘ fun i => restrict s₁ (F i)) l
    (𝓝 (↑(f s₁ hs₁) { val := x, property := hxs₁ }))
⊢ ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
[PROOFSTEP]
have h₂ := (continuous_eval_const (⟨x, hxs₂⟩ : s₂)).continuousAt.tendsto.comp (hf s₂ hs₂)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
s₁ : Set α
hs₁ : IsCompact s₁
s₂ : Set α
hs₂ : IsCompact s₂
x : α
hxs₁ : x ∈ s₁
hxs₂ : x ∈ s₂
this✝ : CompactSpace ↑s₁
this : CompactSpace ↑s₂
h₁ :
  Filter.Tendsto ((fun f => ↑f { val := x, property := hxs₁ }) ∘ fun i => restrict s₁ (F i)) l
    (𝓝 (↑(f s₁ hs₁) { val := x, property := hxs₁ }))
h₂ :
  Filter.Tendsto ((fun f => ↑f { val := x, property := hxs₂ }) ∘ fun i => restrict s₂ (F i)) l
    (𝓝 (↑(f s₂ hs₂) { val := x, property := hxs₂ }))
⊢ ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
[PROOFSTEP]
exact tendsto_nhds_unique h₁ h₂
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
⊢ ∃ f, Filter.Tendsto F l (𝓝 f)
[PROOFSTEP]
have hs : ∀ x : α, ∃ (s : _), IsCompact s ∧ s ∈ 𝓝 x := by
  intro x
  obtain ⟨s, hs, hs'⟩ := exists_compact_mem_nhds x
  exact ⟨s, hs, hs'⟩
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
⊢ ∀ (x : α), ∃ s, IsCompact s ∧ s ∈ 𝓝 x
[PROOFSTEP]
intro x
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
x : α
⊢ ∃ s, IsCompact s ∧ s ∈ 𝓝 x
[PROOFSTEP]
obtain ⟨s, hs, hs'⟩ := exists_compact_mem_nhds x
[GOAL]
case intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
x : α
s : Set α
hs : IsCompact s
hs' : s ∈ 𝓝 x
⊢ ∃ s, IsCompact s ∧ s ∈ 𝓝 x
[PROOFSTEP]
exact ⟨s, hs, hs'⟩
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
hs : ∀ (x : α), ∃ s, IsCompact s ∧ s ∈ 𝓝 x
⊢ ∃ f, Filter.Tendsto F l (𝓝 f)
[PROOFSTEP]
refine ⟨liftCover' _ _ h hs, ?_⟩
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
hs : ∀ (x : α), ∃ s, IsCompact s ∧ s ∈ 𝓝 x
⊢ Filter.Tendsto F l
    (𝓝
      (liftCover'
        (fun s => ∀ ⦃f : Filter α⦄ [inst : Filter.NeBot f], f ≤ Filter.principal s → ∃ a, a ∈ s ∧ ClusterPt a f)
        (fun s hs => f s hs) h hs))
[PROOFSTEP]
rw [tendsto_compactOpen_iff_forall]
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
hs : ∀ (x : α), ∃ s, IsCompact s ∧ s ∈ 𝓝 x
⊢ ∀ (s : Set α),
    IsCompact s →
      Filter.Tendsto (fun i => restrict s (F i)) l
        (𝓝
          (restrict s
            (liftCover'
              (fun s => ∀ ⦃f : Filter α⦄ [inst : Filter.NeBot f], f ≤ Filter.principal s → ∃ a, a ∈ s ∧ ClusterPt a f)
              (fun s hs => f s hs) h hs)))
[PROOFSTEP]
intro s hs
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
hs✝ : ∀ (x : α), ∃ s, IsCompact s ∧ s ∈ 𝓝 x
s : Set α
hs : IsCompact s
⊢ Filter.Tendsto (fun i => restrict s (F i)) l
    (𝓝
      (restrict s
        (liftCover'
          (fun s => ∀ ⦃f : Filter α⦄ [inst : Filter.NeBot f], f ≤ Filter.principal s → ∃ a, a ∈ s ∧ ClusterPt a f)
          (fun s hs => f s hs) h hs✝)))
[PROOFSTEP]
rw [liftCover_restrict']
[GOAL]
case mpr
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
hs✝ : ∀ (x : α), ∃ s, IsCompact s ∧ s ∈ 𝓝 x
s : Set α
hs : IsCompact s
⊢ Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s ?m.52935))
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁵ : TopologicalSpace α
inst✝⁴ : TopologicalSpace β
inst✝³ : TopologicalSpace γ
inst✝² : LocallyCompactSpace α
inst✝¹ : T2Space β
ι : Type u_4
l : Filter ι
inst✝ : Filter.NeBot l
F : ι → C(α, β)
f : (s : Set α) → IsCompact s → C(↑s, β)
hf : ∀ (s : Set α) (hs : IsCompact s), Filter.Tendsto (fun i => restrict s (F i)) l (𝓝 (f s hs))
h :
  ∀ (s₁ : Set α) (hs₁ : IsCompact s₁) (s₂ : Set α) (hs₂ : IsCompact s₂) (x : α) (hxs₁ : x ∈ s₁) (hxs₂ : x ∈ s₂),
    ↑(f s₁ hs₁) { val := x, property := hxs₁ } = ↑(f s₂ hs₂) { val := x, property := hxs₂ }
hs✝ : ∀ (x : α), ∃ s, IsCompact s ∧ s ∈ 𝓝 x
s : Set α
hs : IsCompact s
⊢ s ∈ fun s => ∀ ⦃f : Filter α⦄ [inst : Filter.NeBot f], f ≤ Filter.principal s → ∃ a, a ∈ s ∧ ClusterPt a f
[PROOFSTEP]
exact hf s hs
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
y : β
s : Set α
⊢ ↑(coev α β y) '' s = {y} ×ˢ s
[PROOFSTEP]
aesop
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
⊢ ∀ (s : Set C(α, β × α)), s ∈ {m | ∃ s x u x, m = CompactOpen.gen s u} → IsOpen (coev α β ⁻¹' s)
[PROOFSTEP]
rintro _ ⟨s, sc, u, uo, rfl⟩
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
⊢ IsOpen (coev α β ⁻¹' CompactOpen.gen s u)
[PROOFSTEP]
rw [isOpen_iff_forall_mem_open]
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
⊢ ∀ (x : β), x ∈ coev α β ⁻¹' CompactOpen.gen s u → ∃ t, t ⊆ coev α β ⁻¹' CompactOpen.gen s u ∧ IsOpen t ∧ x ∈ t
[PROOFSTEP]
intro y hy
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
⊢ ∃ t, t ⊆ coev α β ⁻¹' CompactOpen.gen s u ∧ IsOpen t ∧ y ∈ t
[PROOFSTEP]
have hy' : (↑(coev α β y) '' s ⊆ u) := hy
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
hy' : ↑(coev α β y) '' s ⊆ u
⊢ ∃ t, t ⊆ coev α β ⁻¹' CompactOpen.gen s u ∧ IsOpen t ∧ y ∈ t
[PROOFSTEP]
rw [image_coev s] at hy'
[GOAL]
case intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
hy' : {y} ×ˢ s ⊆ u
⊢ ∃ t, t ⊆ coev α β ⁻¹' CompactOpen.gen s u ∧ IsOpen t ∧ y ∈ t
[PROOFSTEP]
rcases generalized_tube_lemma isCompact_singleton sc uo hy' with ⟨v, w, vo, _, yv, sw, vwu⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
hy' : {y} ×ˢ s ⊆ u
v : Set β
w : Set α
vo : IsOpen v
left✝ : IsOpen w
yv : {y} ⊆ v
sw : s ⊆ w
vwu : v ×ˢ w ⊆ u
⊢ ∃ t, t ⊆ coev α β ⁻¹' CompactOpen.gen s u ∧ IsOpen t ∧ y ∈ t
[PROOFSTEP]
refine' ⟨v, _, vo, singleton_subset_iff.mp yv⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
hy' : {y} ×ˢ s ⊆ u
v : Set β
w : Set α
vo : IsOpen v
left✝ : IsOpen w
yv : {y} ⊆ v
sw : s ⊆ w
vwu : v ×ˢ w ⊆ u
⊢ v ⊆ coev α β ⁻¹' CompactOpen.gen s u
[PROOFSTEP]
intro y' hy'
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
hy'✝ : {y} ×ˢ s ⊆ u
v : Set β
w : Set α
vo : IsOpen v
left✝ : IsOpen w
yv : {y} ⊆ v
sw : s ⊆ w
vwu : v ×ˢ w ⊆ u
y' : β
hy' : y' ∈ v
⊢ y' ∈ coev α β ⁻¹' CompactOpen.gen s u
[PROOFSTEP]
change coev α β y' '' s ⊆ u
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
hy'✝ : {y} ×ˢ s ⊆ u
v : Set β
w : Set α
vo : IsOpen v
left✝ : IsOpen w
yv : {y} ⊆ v
sw : s ⊆ w
vwu : v ×ˢ w ⊆ u
y' : β
hy' : y' ∈ v
⊢ ↑(coev α β y') '' s ⊆ u
[PROOFSTEP]
rw [image_coev s]
[GOAL]
case intro.intro.intro.intro.intro.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
s : Set α
sc : IsCompact s
u : Set (β × α)
uo : IsOpen u
y : β
hy : y ∈ coev α β ⁻¹' CompactOpen.gen s u
hy'✝ : {y} ×ˢ s ⊆ u
v : Set β
w : Set α
vo : IsOpen v
left✝ : IsOpen w
yv : {y} ⊆ v
sw : s ⊆ w
vwu : v ×ˢ w ⊆ u
y' : β
hy' : y' ∈ v
⊢ {y'} ×ˢ s ⊆ u
[PROOFSTEP]
exact (prod_mono (singleton_subset_iff.mpr hy') sw).trans vwu
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : C(α × β, γ)
⊢ curry' f = comp f ∘ coev β α
[PROOFSTEP]
ext
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalSpace β
inst✝ : TopologicalSpace γ
f : C(α × β, γ)
x✝ : α
a✝ : β
⊢ ↑(curry' f x✝) a✝ = ↑((comp f ∘ coev β α) x✝) a✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : LocallyCompactSpace (α × β)
⊢ Continuous curry
[PROOFSTEP]
apply continuous_of_continuous_uncurry
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : LocallyCompactSpace (α × β)
⊢ Continuous (Function.uncurry fun x y => ↑(curry x) y)
[PROOFSTEP]
apply continuous_of_continuous_uncurry
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : LocallyCompactSpace (α × β)
⊢ Continuous (Function.uncurry fun x y => ↑(Function.uncurry (fun x y => ↑(curry x) y) x) y)
[PROOFSTEP]
rw [← (Homeomorph.prodAssoc _ _ _).symm.comp_continuous_iff']
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : LocallyCompactSpace (α × β)
⊢ Continuous
    ((Function.uncurry fun x y => ↑(Function.uncurry (fun x y => ↑(curry x) y) x) y) ∘
      ↑(Homeomorph.symm (Homeomorph.prodAssoc C(α × β, γ) α β)))
[PROOFSTEP]
exact continuous_eval'
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
⊢ Continuous uncurry
[PROOFSTEP]
apply continuous_of_continuous_uncurry
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
⊢ Continuous (Function.uncurry fun x y => ↑(uncurry x) y)
[PROOFSTEP]
rw [← (Homeomorph.prodAssoc _ _ _).comp_continuous_iff']
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
⊢ Continuous ((Function.uncurry fun x y => ↑(uncurry x) y) ∘ ↑(Homeomorph.prodAssoc C(α, C(β, γ)) α β))
[PROOFSTEP]
apply continuous_eval'.comp (continuous_eval'.prod_map continuous_id)
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
⊢ Function.LeftInverse uncurry ContinuousMap.curry
[PROOFSTEP]
intro
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
x✝ : C(α × β, γ)
⊢ uncurry (ContinuousMap.curry x✝) = x✝
[PROOFSTEP]
ext
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
x✝ : C(α × β, γ)
a✝ : α × β
⊢ ↑(uncurry (ContinuousMap.curry x✝)) a✝ = ↑x✝ a✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
⊢ Function.RightInverse uncurry ContinuousMap.curry
[PROOFSTEP]
intro
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
x✝ : C(α, C(β, γ))
⊢ ContinuousMap.curry (uncurry x✝) = x✝
[PROOFSTEP]
ext
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝⁴ : TopologicalSpace α
inst✝³ : TopologicalSpace β
inst✝² : TopologicalSpace γ
inst✝¹ : LocallyCompactSpace α
inst✝ : LocallyCompactSpace β
x✝ : C(α, C(β, γ))
a✝¹ : α
a✝ : β
⊢ ↑(↑(ContinuousMap.curry (uncurry x✝)) a✝¹) a✝ = ↑(↑x✝ a✝¹) a✝
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : Unique α
f : C(α, β)
⊢ const α ((fun f => ↑f default) f) = f
[PROOFSTEP]
ext a
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : Unique α
f : C(α, β)
a : α
⊢ ↑(const α ((fun f => ↑f default) f)) a = ↑f a
[PROOFSTEP]
rw [Unique.eq_default a]
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
inst✝³ : TopologicalSpace α
inst✝² : TopologicalSpace β
inst✝¹ : TopologicalSpace γ
inst✝ : Unique α
f : C(α, β)
a : α
⊢ ↑(const α ((fun f => ↑f default) f)) default = ↑f default
[PROOFSTEP]
rfl
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
⊢ Continuous g
[PROOFSTEP]
let Gf : C(X₀, C(Y, Z)) := ContinuousMap.curry ⟨_, hg⟩
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
⊢ Continuous g
[PROOFSTEP]
have h : ∀ x : X, Continuous fun y => g (x, y) := by
  intro x
  obtain ⟨x₀, rfl⟩ := hf.surjective x
  exact (Gf x₀).continuous
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
⊢ ∀ (x : X), Continuous fun y => g (x, y)
[PROOFSTEP]
intro x
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
x : X
⊢ Continuous fun y => g (x, y)
[PROOFSTEP]
obtain ⟨x₀, rfl⟩ := hf.surjective x
[GOAL]
case intro
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
x₀ : X₀
⊢ Continuous fun y => g (f x₀, y)
[PROOFSTEP]
exact (Gf x₀).continuous
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
h : ∀ (x : X), Continuous fun y => g (x, y)
⊢ Continuous g
[PROOFSTEP]
let G : X → C(Y, Z) := fun x => ⟨_, h x⟩
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => mk fun y => g (x, y)
⊢ Continuous g
[PROOFSTEP]
have : Continuous G := by
  rw [hf.continuous_iff]
  exact Gf.continuous
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => mk fun y => g (x, y)
⊢ Continuous G
[PROOFSTEP]
rw [hf.continuous_iff]
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => mk fun y => g (x, y)
⊢ Continuous (G ∘ f)
[PROOFSTEP]
exact Gf.continuous
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : X × Y → Z
hg : Continuous fun p => g (f p.fst, p.snd)
Gf : C(X₀, C(Y, Z)) := curry (mk fun p => g (f p.fst, p.snd))
h : ∀ (x : X), Continuous fun y => g (x, y)
G : X → C(Y, Z) := fun x => mk fun y => g (x, y)
this : Continuous G
⊢ Continuous g
[PROOFSTEP]
exact ContinuousMap.continuous_uncurry_of_continuous ⟨G, this⟩
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : Y × X → Z
hg : Continuous fun p => g (p.fst, f p.snd)
⊢ Continuous g
[PROOFSTEP]
have : Continuous fun p : X₀ × Y => g ((Prod.swap p).1, f (Prod.swap p).2) := hg.comp continuous_swap
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : Y × X → Z
hg : Continuous fun p => g (p.fst, f p.snd)
this : Continuous fun p => g ((Prod.swap p).fst, f (Prod.swap p).snd)
⊢ Continuous g
[PROOFSTEP]
have : Continuous fun p : X₀ × Y => (g ∘ Prod.swap) (f p.1, p.2) := this
[GOAL]
X₀ : Type u_1
X : Type u_2
Y : Type u_3
Z : Type u_4
inst✝⁴ : TopologicalSpace X₀
inst✝³ : TopologicalSpace X
inst✝² : TopologicalSpace Y
inst✝¹ : TopologicalSpace Z
inst✝ : LocallyCompactSpace Y
f : X₀ → X
hf : QuotientMap f
g : Y × X → Z
hg : Continuous fun p => g (p.fst, f p.snd)
this✝ : Continuous fun p => g ((Prod.swap p).fst, f (Prod.swap p).snd)
this : Continuous fun p => (g ∘ Prod.swap) (f p.fst, p.snd)
⊢ Continuous g
[PROOFSTEP]
exact (hf.continuous_lift_prod_left this).comp continuous_swap