1-- Uniform continuity between metric spaces: Lipschitz maps and isometries2-- are uniformly continuous, uniformly continuous maps are continuous,3-- compose, and preserve Cauchy sequences4-- Part of Cumulus, the Grace17 mathematics library.5-- Copyright (c) 2026 Grant Passmore.6-- Released under the Apache License 2.0. See LICENSE in the repository root.7-- Authors: Grant Passmore89module Grace.Cumulus.Metric.Uniform10import Bounded1112predicate IsUniformlyContinuous (f X d Y e : Set) :=13 FunctionBetween(f, X, Y) ∧14 (∀ ε ∈ ℝ, 0 < ε →∃ δ ∈ ℝ, 0 < δ ∧15∀ x ∈ X, ∀ y ∈ X, (d(x, y) < δ → e(f(x), f(y)) < ε))1617theorem IsUniformlyContinuous.function (f X d Y e : Set)18requires uniform : IsUniformlyContinuous(f, X, d, Y, e)19shows f : X → Y20proof21exact uniform.left2223theorem IsUniformlyContinuous.control (f X d Y e : Set, ε : Real)24requires uniform : IsUniformlyContinuous(f, X, d, Y, e)25requires positive : 0 < ε26shows∃ δ ∈ ℝ, 0 < δ ∧∀ x ∈ X, ∀ y ∈ X, (d(x, y) < δ → e(f(x), f(y)) < ε)27proof28obtain⟨function, control⟩:= uniform29have realE : ε ∈ ℝ bytypecheck30exact control with ε, realE, positive3132theorem IsUniformlyContinuous.of_control (f X d Y e : Set)33requires function : f : X → Y34requires control : ∀ ε ∈ ℝ, 0 < ε →∃ δ ∈ ℝ, 0 < δ ∧35∀ x ∈ X, ∀ y ∈ X, (d(x, y) < δ → e(f(x), f(y)) < ε)36shows IsUniformlyContinuous(f, X, d, Y, e)37proof38exact⟨function, control⟩3940theorem IsUniformlyContinuous.continuous_at (f X d Y e x : Set)41requires uniform : IsUniformlyContinuous(f, X, d, Y, e)42requires hx : x ∈ X43shows MetricContinuousAt(f, X, d, Y, e, x)44proof45have function := IsUniformlyContinuous.function with uniform46apply MetricContinuousAt.of_control with function, hx47intros ε hε positive48obtain⟨δ, hδ, positiveD, maps⟩:=49 IsUniformlyContinuous.control with uniform, positive50refine⟨δ, hδ, positiveD, ?_⟩51intros y hy near52exact maps with x, hx, y, hy, near5354theorem IsUniformlyContinuous.continuous (f X d Y e : Set)55requires uniform : IsUniformlyContinuous(f, X, d, Y, e)56shows IsMetricContinuous(f, X, d, Y, e)57proof58apply IsMetricContinuous.of_pointwise with (IsUniformlyContinuous.function with59 uniform)60intros x hx61exact IsUniformlyContinuous.continuous_at with uniform, hx6263theorem IsLipschitz.uniformly_continuous (f X d Y e : Set) (K : Real)64requires metricD : IsMetric(X, d)65requires metricE : IsMetric(Y, e)66requires lipschitz : IsLipschitz(f, X, d, Y, e, K)67shows IsUniformlyContinuous(f, X, d, Y, e)68proof69have function := IsLipschitz.function with lipschitz70have nonnegative := IsLipschitz.nonnegative with lipschitz71apply IsUniformlyContinuous.of_control with function72intros ε hε positive73obtain⟨positiveD, small⟩:= Lipschitz.modulus with nonnegative, positive74have quotientReal : ε / (K +1) ∈ ℝ bytypecheck75refine⟨ε / (K +1), quotientReal, positiveD, ?_⟩76intros x hx y hy near77have bound := IsLipschitz.bound with lipschitz, hx, hy78have imageX := FunctionBetween.apply_closed with function, hx79have imageY := FunctionBetween.apply_closed with function, hy80have dxy := IsMetric.real with metricD, hx, hy81have exy := IsMetric.real with metricE, imageX, imageY82have le := realLess.implies_le with near83have scaled := realLe.mul_left_of_nonnegative with le, nonnegative84linarith8586theorem IsIsometry.uniformly_continuous (f X d Y e : Set)87requires isometry : IsIsometry(f, X, d, Y, e)88shows IsUniformlyContinuous(f, X, d, Y, e)89proof90have function := IsIsometry.function with isometry91apply IsUniformlyContinuous.of_control with function92intros ε hε positive93refine⟨ε, hε, positive, ?_⟩94intros x hx y hy near95have preserved := IsIsometry.distance with isometry, hx, hy96 rwa preserved9798theorem identity.uniformly_continuous (X d : Set)99shows IsUniformlyContinuous(identity(X), X, d, X, d)100proof101exact IsIsometry.uniformly_continuous with (identity.isometry at X, d)102103theorem constantFunction.uniformly_continuous (X d Y e c : Set)104requires metric : IsMetric(Y, e)105requires hc : c ∈ Y106shows IsUniformlyContinuous(constantFunction(X, Y, c), X, d, Y, e)107proof108have function := constantFunction.function at X, Y, c with hc109apply IsUniformlyContinuous.of_control with function110intros ε hε positive111refine⟨ε, hε, positive, ?_⟩112intros x hx y hy near113have valueX := constantFunction.apply with hx, hc114have valueY := constantFunction.apply with hy, hc115rw [valueX, valueY]116haveself:= IsMetric.self with metric, hc117rwself118exact positive119120theorem IsUniformlyContinuous.compose (g f X d Y e Z k : Set)121requires first : IsUniformlyContinuous(f, X, d, Y, e)122requires second : IsUniformlyContinuous(g, Y, e, Z, k)123shows IsUniformlyContinuous(compose(g, f, X, Y, Z), X, d, Z, k)124proof125have fFunction := IsUniformlyContinuous.function with first126have gFunction := IsUniformlyContinuous.function with second127apply IsUniformlyContinuous.of_control with (compose.function with128 fFunction, gFunction)129intros ε hε positive130obtain⟨η, hη, positiveH, mapsG⟩:=131 IsUniformlyContinuous.control with second, positive132obtain⟨δ, hδ, positiveD, mapsF⟩:=133 IsUniformlyContinuous.control with first, positiveH134refine⟨δ, hδ, positiveD, ?_⟩135intros x hx y hy near136have valueX := compose.apply with fFunction, gFunction, hx137have valueY := compose.apply with fFunction, gFunction, hy138rw [valueX, valueY]139have imageX := FunctionBetween.apply_closed with fFunction, hx140have imageY := FunctionBetween.apply_closed with fFunction, hy141have middle := mapsF with x, hx, y, hy, near142exact mapsG with f(x), imageX, f(y), imageY, middle143144-- Uniformly continuous maps send Cauchy sequences to Cauchy sequences.145theorem IsUniformlyContinuous.cauchy (f X d Y e u : Set)146requires uniform : IsUniformlyContinuous(f, X, d, Y, e)147requires cauchy : IsCauchy(X, d, u)148shows IsCauchy(Y, e, compose(f, u, ℕ, X, Y))149proof150have function := IsUniformlyContinuous.function with uniform151have sequence := IsCauchy.sequence with cauchy152have uFunction := SequenceIn.function with sequence153have composite := SequenceIn.compose with sequence, function154apply IsCauchy.of_eventually with composite155intros ε hε positive156obtain⟨δ, hδ, positiveD, maps⟩:=157 IsUniformlyContinuous.control with uniform, positive158obtain⟨N, hN, close⟩:= IsCauchy.eventually with cauchy, positiveD159refine⟨N, hN, ?_⟩160intros m hm n hn leM leN161have termM := SequenceIn.term_of_member with sequence, hm162have termN := SequenceIn.term_of_member with sequence, hn163have valueM := compose.apply with uFunction, function, hm164have valueN := compose.apply with uFunction, function, hn165rw [valueM, valueN]166exact maps with u(m), termM, u(n), termN, (close with m, hm, n, hn, leM, leN)167168theorem IsUniformlyContinuous.of_isometry_compose (g f X d Y e Z k : Set)169requires isometry : IsIsometry(f, X, d, Y, e)170requires uniform : IsUniformlyContinuous(g, Y, e, Z, k)171shows IsUniformlyContinuous(compose(g, f, X, Y, Z), X, d, Z, k)172proof173have first := IsIsometry.uniformly_continuous with isometry174exact IsUniformlyContinuous.compose with first, uniform175