Zulip Chat Archive

Stream: maths

Topic: Geodesic spaces


Horatiu Cheval (Oct 13 2021 at 10:39):

I am trying to define geodesic spaces. The definition I want to implement is, on paper, the following: A geodesic space is a metric space (X,d)(X, d) such that for all x,y∈Xx, y \in X, there exists an isometry γx,y:[0,d(x,y)]→X\gamma_{x, y} : [0, d(x, y)] \to X, such that γx,y(0)=x\gamma_{x, y}(0) = x and γx,y((d(x,y))=y\gamma_{x, y}((d(x, y)) = y. I am faced with a choice between the following two definitions below, one where geodesics take arguments in set.Icc, and one where they are defined on the whole ℝ with junk values outside of the interval of interest.

import topology.metric_space.basic
import topology.metric_space.isometry

class geodesic_space1 (X : Type*) extends metric_space X :=
(geodesic : Π (x y : X), set.Icc 0 (dist x y) → X)
(geodesic_iso : ∀ x y, isometry (geodesic x y))
(left_point : ∀ x y, geodesic x y ⟨0, by simp only [set.left_mem_Icc]; apply dist_nonneg⟩ = x)
(right_point : ∀ x y, geodesic x y ⟨dist x y, by simp only [set.right_mem_Icc]; apply dist_nonneg⟩ = y)

class geodesic_space2 (X : Type*) extends metric_space X :=
(geodesic : Π x y : X, ℝ → X)
(geodesic_iso : ∀ (x y : X) (s t ∈ set.Icc 0 (dist x y)), dist (geodesic x y s) (geodesic x y t) = abs (s - t))
(left_point : ∀ x y, geodesic x y 0 = x)
(right_point : ∀ x y, geodesic x y (dist x y) = y)

Which one do you think is best? With geodesic_space1 I worry that keeping working with coercions to set.Icc might turn out cumbersome in the long run, but at the same time this allows me to use docs#isometry in the definition, so that I may easily rely on the lemmas about it.

Sebastien Gouezel (Oct 13 2021 at 11:46):

There is a problem with both your definitions, that you are putting data into it. Which can lead to diamonds later on. Instead, you could (should?) define it as Prop-valued (and as a mixin on metric spaces, instead of extending metric spaces) -- and then the precise definition doesn't matter, because they are equivalent. What you can do then, under the assumptions [metric_space X] [geodesic_space X], is to choose some geodesic between x and y (and I'd probably choose it as a function on Icc, but providing also the extended value on the whole line, equal to x before 0 and to yafter d(x,y) to have a globally continuous object).

Kevin Buzzard (Oct 13 2021 at 11:47):

If it's a prop you could call it is_geodesic_space X, which makes it easier for people to guess that it's a Prop

Horatiu Cheval (Oct 13 2021 at 16:44):

Thank you for the suggestions. Let me see if I understood it correctly. Is something like this what you mean?

import topology.metric_space.basic
import topology.metric_space.isometry

structure is_geodesic {X : Type*} [metric_space X] (x y : X) (γ : set.Icc 0 (dist x y) → X) : Prop :=
(iso : isometry γ)
(left_point : γ ⟨0, by simp only [set.left_mem_Icc]; apply dist_nonneg⟩  = x)
(right_point : γ ⟨dist x y, by simp only [set.right_mem_Icc]; apply dist_nonneg⟩ = y)

class is_geodesic_space (X : Type*) [metric_space X] : Prop :=
(geodesic : ∀ x y : X, ∃ γ, is_geodesic x y γ)

Horatiu Cheval (Oct 13 2021 at 16:46):

Also, I am not sure what do you mean by defining it on Icc while also providing the extension to the whole line? Do you mean that I should then define something like this?

noncomputable def geodesic_to_whole_line
{X : Type*} [metric_space X] (x y : X) (γ : set.Icc 0 (dist x y) → X) : ℝ → X := λ t,
if ha : t < 0 then x
else if hb : dist x y < t then y
else γ ⟨t, sorry⟩

Yury G. Kudryashov (Oct 13 2021 at 16:47):

Note that we have docs#set.proj_Icc

Yury G. Kudryashov (Oct 13 2021 at 16:49):

Also, we have some theory about paths indexed by Icc 0 1 (e.g., homotopies), so you might want to use f : Icc 0 1 → X with dist (f a) (f b) = dist x y * dist a b.


Last updated: Feb 28 2026 at 14:05 UTC