Documentation

TauCeti.RepresentationTheory.LSPath.PLPath

Piecewise-linear paths up to reparametrization #

Littelmann's path model works with piecewise-linear paths Ο€ : [0, 1] β†’ V starting at Ο€ 0 = 0 in a vector space V over an ordered field π•œ (the weight space X βŠ— β„š or X βŠ— ℝ of a root datum), identified up to nondecreasing surjective piecewise-linear reparametrization. A finite presentation of such a path is a subdivision 0 = tβ‚€ ≀ t₁ ≀ β‹― ≀ tβ‚™ = 1 on whose pieces Ο€ is affine; it is recorded by its list of segments [v₁, …, vβ‚™], vβ‚– = Ο€ tβ‚– - Ο€ tₖ₋₁. The lengths tβ‚– - tₖ₋₁ are not recorded, since a reparametrization can change them at will. Two elementary moves change a presentation but are meant not to change the path it presents:

This file develops these presentations and their normal form. The algorithm TauCeti.PLPath.normalize removes the stationary segments and merges adjacent segments pointing in the same direction, using only the vector-space operations of V (so a presentation over β„š stays over β„š; no Euclidean arc length is involved). Its output is reduced, and two segment lists have the same normal form exactly when they are related by the elementary moves. The type TauCeti.PLPath π•œ V models paths by reduced segment lists, with Littelmann's concatenation π₁ * Ο€β‚‚ as a monoid structure, the endpoint Ο€ 1, and the reversed path t ↦ Ο€ (1 - t) - Ο€ 1.

This file works with segment lists only. The parametrized paths π•œ β†’ V of presentations with durations (running over [0, duration p]), and the theorem that two presentations are reparametrizations of a common one exactly when their normal forms agree, are in TauCeti/RepresentationTheory/LSPath/Reparametrization.lean.

Main definitions #

Main results #

References #

The normalization algorithm #

noncomputable def TauCeti.PLPath.consMerge (π•œ : Type u) {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) :
List V β†’ List V

Prepend the segment v to the segment list l, merging it into the first segment of l when the two point in the same direction, and dropping it when v = 0 and l is empty. This is the single step of TauCeti.PLPath.normalize.

Instances For
    noncomputable def TauCeti.PLPath.normalize (π•œ : Type u) {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :

    The normal form of a segment list: the stationary segments are removed and adjacent segments pointing in the same direction are merged, by prepending the segments one at a time with TauCeti.PLPath.consMerge.

    Instances For
      structure TauCeti.PLPath.IsReduced (π•œ : Type u) {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :

      A segment list is reduced if it has no stationary (zero) segment and no two adjacent segments point in the same direction. Reduced lists are the normal forms of TauCeti.PLPath.normalize.

      • ne_zero (v : V) : v ∈ l β†’ v β‰  0

        No segment is stationary.

      • isChain : List.IsChain (fun (v w : V) => Β¬SameRay π•œ v w) l

        No two adjacent segments point in the same direction.

      Instances For
        inductive TauCeti.PLPath.Move (π•œ : Type u) {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
        List V β†’ List V β†’ Prop

        The elementary moves between segment lists, which change the presentation of a path but are meant not to change the path: merging two adjacent segments in the same ray (the inverse of subdividing a segment), and removing a stationary segment.

        Instances For
          @[simp]
          theorem TauCeti.PLPath.consMerge_zero {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
          consMerge π•œ 0 l = l
          theorem TauCeti.PLPath.consMerge_nil_of_ne_zero {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v : V} (hv : v β‰  0) :
          consMerge π•œ v [] = [v]
          theorem TauCeti.PLPath.consMerge_cons_of_sameRay {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v w : V} {l : List V} (h : SameRay π•œ v w) :
          consMerge π•œ v (w :: l) = (v + w) :: l
          theorem TauCeti.PLPath.consMerge_cons_of_not_sameRay {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v w : V} {l : List V} (h : Β¬SameRay π•œ v w) :
          consMerge π•œ v (w :: l) = v :: w :: l
          theorem TauCeti.PLPath.consMerge_consMerge {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v w : V} (h : SameRay π•œ v w) (l : List V) :
          consMerge π•œ v (consMerge π•œ w l) = consMerge π•œ (v + w) l

          Prepending two segments in the same ray one after the other is the same as prepending their sum.

          @[simp]
          theorem TauCeti.PLPath.normalize_nil {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
          normalize π•œ [] = []
          @[simp]
          theorem TauCeti.PLPath.normalize_cons {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) (l : List V) :
          normalize π•œ (v :: l) = consMerge π•œ v (normalize π•œ l)
          theorem TauCeti.PLPath.normalize_append {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l₁ lβ‚‚ : List V) :
          normalize π•œ (l₁ ++ lβ‚‚) = List.foldr (consMerge π•œ) (normalize π•œ lβ‚‚) l₁
          @[simp]
          theorem TauCeti.PLPath.normalize_normalize {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
          normalize π•œ (normalize π•œ l) = normalize π•œ l
          @[simp]
          theorem TauCeti.PLPath.normalize_normalize_append {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l₁ lβ‚‚ : List V) :
          normalize π•œ (normalize π•œ l₁ ++ lβ‚‚) = normalize π•œ (l₁ ++ lβ‚‚)
          @[simp]
          theorem TauCeti.PLPath.normalize_append_normalize {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l₁ lβ‚‚ : List V) :
          normalize π•œ (l₁ ++ normalize π•œ lβ‚‚) = normalize π•œ (l₁ ++ lβ‚‚)
          @[simp]
          theorem TauCeti.PLPath.sum_consMerge {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) (l : List V) :
          (consMerge π•œ v l).sum = v + l.sum

          Prepending a segment with TauCeti.PLPath.consMerge adds it to the endpoint.

          @[simp]
          theorem TauCeti.PLPath.sum_normalize {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
          (normalize π•œ l).sum = l.sum

          Normalization preserves the endpoint v₁ + β‹― + vβ‚™ of a presentation.

          @[simp]
          theorem TauCeti.PLPath.consMerge_eq_nil_iff {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v : V} {l : List V} :
          consMerge π•œ v l = [] ↔ v = 0 ∧ l = []
          @[simp]
          theorem TauCeti.PLPath.normalize_eq_nil_iff {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l : List V} :
          normalize π•œ l = [] ↔ βˆ€ v ∈ l, v = 0

          The normal form of a segment list is empty exactly when every segment is stationary.

          Reduced segment lists #

          @[simp]
          theorem TauCeti.PLPath.isReduced_nil {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
          IsReduced π•œ []
          theorem TauCeti.PLPath.isReduced_cons_iff {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v : V} {l : List V} :
          IsReduced π•œ (v :: l) ↔ v β‰  0 ∧ (βˆ€ w ∈ l.head?, Β¬SameRay π•œ v w) ∧ IsReduced π•œ l
          theorem TauCeti.PLPath.IsReduced.consMerge {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l : List V} (h : IsReduced π•œ l) (v : V) :
          IsReduced π•œ (PLPath.consMerge π•œ v l)
          theorem TauCeti.PLPath.isReduced_normalize {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
          IsReduced π•œ (normalize π•œ l)
          theorem TauCeti.PLPath.mem_of_mem_normalize {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l : List V} {T : Set V} (hT : βˆ€ v ∈ T, βˆ€ w ∈ T, SameRay π•œ v w β†’ v + w ∈ T) (hl : βˆ€ v ∈ l, v β‰  0 β†’ v ∈ T) {v : V} (hv : v ∈ normalize π•œ l) :
          v ∈ T

          Normalization only merges segments in the same ray and drops stationary ones. So if a set T contains v + w for all v, w ∈ T in the same ray, and contains every nonstationary segment of l, then it contains every segment of normalize π•œ l.

          theorem TauCeti.PLPath.IsReduced.normalize_eq {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l : List V} (h : IsReduced π•œ l) :
          normalize π•œ l = l
          theorem TauCeti.PLPath.normalize_eq_self_iff {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l : List V} :
          normalize π•œ l = l ↔ IsReduced π•œ l

          A segment list is its own normal form exactly when it is reduced.

          theorem TauCeti.PLPath.IsReduced.reverse_map_neg {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l : List V} (h : IsReduced π•œ l) :

          Reversing the order of the segments and negating them preserves reducedness.

          Elementary moves #

          theorem TauCeti.PLPath.Move.cons {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l₁ lβ‚‚ : List V} (h : Move π•œ l₁ lβ‚‚) (v : V) :
          Move π•œ (v :: l₁) (v :: lβ‚‚)
          theorem TauCeti.PLPath.Move.reverse_map_neg {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l₁ lβ‚‚ : List V} (h : Move π•œ l₁ lβ‚‚) :
          Move π•œ (List.map Neg.neg l₁).reverse (List.map Neg.neg lβ‚‚).reverse
          theorem TauCeti.PLPath.Move.normalize_eq {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l₁ lβ‚‚ : List V} (h : Move π•œ l₁ lβ‚‚) :
          normalize π•œ l₁ = normalize π•œ lβ‚‚

          An elementary move does not change the normal form.

          theorem TauCeti.PLPath.reflTransGen_move_consMerge {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) (l : List V) :
          Relation.ReflTransGen (Move π•œ) (v :: l) (consMerge π•œ v l)

          Prepending a segment with TauCeti.PLPath.consMerge is a sequence of elementary moves.

          theorem TauCeti.PLPath.reflTransGen_move_normalize {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
          Relation.ReflTransGen (Move π•œ) l (normalize π•œ l)

          Every segment list is connected to its normal form by elementary moves.

          theorem TauCeti.PLPath.normalize_eq_normalize_iff {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l₁ lβ‚‚ : List V} :
          normalize π•œ l₁ = normalize π•œ lβ‚‚ ↔ Relation.EqvGen (Move π•œ) l₁ lβ‚‚

          Two segment lists have the same normal form exactly when they are related by elementary moves: the normal form is a complete invariant for the elementary moves.

          theorem TauCeti.PLPath.normalize_reverse_map_neg {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
          structure TauCeti.PLPath (π•œ : Type u) (V : Type v) [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :

          A model of piecewise-linear paths Ο€ : [0, 1] β†’ V with Ο€ 0 = 0, up to nondecreasing surjective piecewise-linear reparametrization, by reduced segment lists: a path is meant to be recorded by the successive displacements along its maximal straight pieces. See TauCeti.PLPath.ofSegments for the path presented by an arbitrary segment list, and TauCeti.PLPath.ofSegments_map_snd_eq_iff_exists_isReparam for the comparison with parametrized paths.

          • segments : List V

            The segments of the path, in order.

          • isReduced : IsReduced π•œ self.segments

            The segment list is reduced.

          Instances For
            theorem TauCeti.PLPath.ext_iff {π•œ : Type u} {V : Type v} {inst✝ : Field π•œ} {inst✝¹ : PartialOrder π•œ} {inst✝² : IsStrictOrderedRing π•œ} {inst✝³ : AddCommGroup V} {inst✝⁴ : Module π•œ V} {x y : PLPath π•œ V} :
            theorem TauCeti.PLPath.ext {π•œ : Type u} {V : Type v} {inst✝ : Field π•œ} {inst✝¹ : PartialOrder π•œ} {inst✝² : IsStrictOrderedRing π•œ} {inst✝³ : AddCommGroup V} {inst✝⁴ : Module π•œ V} {x y : PLPath π•œ V} (segments : x.segments = y.segments) :
            x = y

            Paths presented by segment lists #

            noncomputable def TauCeti.PLPath.ofSegments (π•œ : Type u) {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
            PLPath π•œ V

            The path presented by a segment list: it traverses the segments in order.

            Instances For
              noncomputable def TauCeti.PLPath.straight (π•œ : Type u) {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) :
              PLPath π•œ V

              The straight path t ↦ t β€’ v.

              Instances For
                theorem TauCeti.PLPath.straight_def {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) :
                straight π•œ v = ofSegments π•œ [v]
                @[simp]
                theorem TauCeti.PLPath.segments_ofSegments {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
                (ofSegments π•œ l).segments = normalize π•œ l
                @[simp]
                theorem TauCeti.PLPath.ofSegments_segments {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :
                ofSegments π•œ p.segments = p
                theorem TauCeti.PLPath.ofSegments_surjective {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                theorem TauCeti.PLPath.ofSegments_eq_ofSegments_iff {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l₁ lβ‚‚ : List V} :
                ofSegments π•œ l₁ = ofSegments π•œ lβ‚‚ ↔ Relation.EqvGen (Move π•œ) l₁ lβ‚‚

                Two segment lists define the same TauCeti.PLPath, that is have the same normal form, exactly when they are related by elementary moves.

                Concatenation #

                @[instance_reducible]
                instance TauCeti.PLPath.instOne {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                One (PLPath π•œ V)

                The constant path at 0.

                @[instance_reducible]
                noncomputable instance TauCeti.PLPath.instMul {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                Mul (PLPath π•œ V)

                Littelmann's concatenation π₁ * Ο€β‚‚: traverse π₁, then the translate of Ο€β‚‚ by the endpoint of π₁.

                @[simp]
                theorem TauCeti.PLPath.segments_one {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                @[simp]
                theorem TauCeti.PLPath.segments_mul {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p q : PLPath π•œ V) :
                (p * q).segments = normalize π•œ (p.segments ++ q.segments)
                @[simp]
                theorem TauCeti.PLPath.ofSegments_nil {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                ofSegments π•œ [] = 1
                @[simp]
                theorem TauCeti.PLPath.ofSegments_eq_one_iff {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {l : List V} :
                ofSegments π•œ l = 1 ↔ βˆ€ v ∈ l, v = 0

                A segment list presents the constant path exactly when every segment is stationary.

                @[simp]
                theorem TauCeti.PLPath.ofSegments_append {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l₁ lβ‚‚ : List V) :
                ofSegments π•œ (l₁ ++ lβ‚‚) = ofSegments π•œ l₁ * ofSegments π•œ lβ‚‚
                @[instance_reducible]
                noncomputable instance TauCeti.PLPath.instMonoid {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                Monoid (PLPath π•œ V)
                theorem TauCeti.PLPath.ofSegments_cons {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) (l : List V) :
                ofSegments π•œ (v :: l) = straight π•œ v * ofSegments π•œ l

                A path presented by v :: l is the straight path along v followed by the path presented by l.

                @[simp]
                theorem TauCeti.PLPath.ofSegments_zero_cons {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
                ofSegments π•œ (0 :: l) = ofSegments π•œ l

                A stationary first segment does not change the presented path.

                theorem TauCeti.PLPath.prod_map_straight {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
                (List.map (straight π•œ) l).prod = ofSegments π•œ l

                Every path is the concatenation of the straight paths along its segments.

                The endpoint #

                def TauCeti.PLPath.endpoint {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :
                V

                The endpoint Ο€ 1 of a path, the sum of its segments.

                Instances For
                  theorem TauCeti.PLPath.endpoint_def {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :
                  @[simp]
                  theorem TauCeti.PLPath.endpoint_ofSegments {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
                  (ofSegments π•œ l).endpoint = l.sum
                  @[simp]
                  theorem TauCeti.PLPath.endpoint_one {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                  @[simp]
                  theorem TauCeti.PLPath.endpoint_mul {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p q : PLPath π•œ V) :

                  Reversal #

                  def TauCeti.PLPath.reverse {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :
                  PLPath π•œ V

                  The reversed path t ↦ Ο€ (1 - t) - Ο€ 1: its segments are those of Ο€, negated and in the opposite order.

                  Instances For
                    @[simp]
                    theorem TauCeti.PLPath.segments_reverse {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :
                    @[simp]
                    theorem TauCeti.PLPath.reverse_ofSegments {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (l : List V) :
                    @[simp]
                    theorem TauCeti.PLPath.reverse_reverse {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :
                    theorem TauCeti.PLPath.reverse_involutive {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                    @[simp]
                    theorem TauCeti.PLPath.reverse_one {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                    @[simp]
                    theorem TauCeti.PLPath.reverse_mul {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p q : PLPath π•œ V) :
                    @[simp]
                    theorem TauCeti.PLPath.endpoint_reverse {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :

                    Straight paths #

                    theorem TauCeti.PLPath.segments_straight_of_ne_zero {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v : V} (hv : v β‰  0) :
                    (straight π•œ v).segments = [v]
                    @[simp]
                    theorem TauCeti.PLPath.straight_zero {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] :
                    straight π•œ 0 = 1
                    @[simp]
                    theorem TauCeti.PLPath.endpoint_straight {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) :
                    (straight π•œ v).endpoint = v
                    @[simp]
                    theorem TauCeti.PLPath.reverse_straight {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (v : V) :
                    (straight π•œ v).reverse = straight π•œ (-v)
                    theorem TauCeti.PLPath.straight_add {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {v w : V} (h : SameRay π•œ v w) :
                    straight π•œ (v + w) = straight π•œ v * straight π•œ w

                    Subdivision: the straight path along v + w, for v and w in the same ray, is the straight path along v followed by the straight path along w.

                    theorem TauCeti.PLPath.straight_smul_mul_straight_smul {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {a b : π•œ} (ha : 0 ≀ a) (hb : 0 ≀ b) (w : V) :
                    straight π•œ (a β€’ w) * straight π•œ (b β€’ w) = straight π•œ ((a + b) β€’ w)

                    Subdivision along a ray: for 0 ≀ a and 0 ≀ b, the straight path along a β€’ w followed by the straight path along b β€’ w is the straight path along (a + b) β€’ w.

                    @[simp]
                    theorem TauCeti.PLPath.straight_natCast_smul {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (n : β„•) (v : V) :
                    straight π•œ (↑n β€’ v) = straight π•œ v ^ n

                    A straight path along a natural multiple is the concatenation power of the original straight path.

                    theorem TauCeti.PLPath.ofSegments_smul_cons_smul_cons {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {a b : π•œ} (ha : 0 ≀ a) (hb : 0 ≀ b) (w : V) (l : List V) :
                    ofSegments π•œ (a β€’ w :: b β€’ w :: l) = ofSegments π•œ ((a + b) β€’ w :: l)

                    Subdividing a segment along its ray does not change the presented path: for 0 ≀ a and 0 ≀ b, the segments a β€’ w and b β€’ w present the same path as the single segment (a + b) β€’ w.

                    theorem TauCeti.PLPath.ofSegments_append_cut_eq {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {a m r : List V} {v : V} {ΞΈ : π•œ} (hΞΈβ‚€ : 0 ≀ ΞΈ) (hθ₁ : ΞΈ ≀ 1) :
                    ofSegments π•œ (a ++ (m ++ [ΞΈ β€’ v]) ++ (1 - ΞΈ) β€’ v :: r) = ofSegments π•œ (a ++ m ++ v :: r)

                    Cutting a segment v of a path at the fraction θ ∈ [0, 1], in the middle of the segments a ++ m ++ v :: r, does not change the path presented by the segments.

                    theorem TauCeti.PLPath.ofSegments_div_smul_cons_sub_div_smul_cons {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] [PosMulReflectLT π•œ] {d e : π•œ} (hd : 0 ≀ d) (hde : d ≀ e) (he : 0 < e) (w : V) (l : List V) :
                    ofSegments π•œ ((d / e) β€’ w :: ((e - d) / e) β€’ w :: l) = ofSegments π•œ (w :: l)

                    Subdividing a segment w at the fraction d / e, for 0 ≀ d ≀ e and 0 < e, into the segments (d / e) β€’ w and ((e - d) / e) β€’ w does not change the presented path.

                    Linear images #

                    theorem TauCeti.PLPath.Move.map {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] {l m : List V} (h : Move π•œ l m) (g : V β†’β‚—[π•œ] W) :
                    Move π•œ (List.map (⇑g) l) (List.map (⇑g) m)

                    Taking a linear image preserves elementary path moves, including when segments collapse.

                    theorem TauCeti.PLPath.ofSegments_map_normalize {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (g : V β†’β‚—[π•œ] W) (l : List V) :
                    ofSegments π•œ (List.map (⇑g) (normalize π•œ l)) = ofSegments π•œ (List.map (⇑g) l)

                    Normalizing a presentation before taking its linear image does not change the path.

                    noncomputable def TauCeti.PLPath.map {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (p : PLPath π•œ V) (g : V β†’β‚—[π•œ] W) :
                    PLPath π•œ W

                    The linear image of a piecewise-linear path, with any collapsed segments removed.

                    Instances For
                      theorem TauCeti.PLPath.map_def {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (p : PLPath π•œ V) (g : V β†’β‚—[π•œ] W) :
                      p.map g = ofSegments π•œ (List.map (⇑g) p.segments)
                      @[simp]
                      theorem TauCeti.PLPath.map_ofSegments {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (l : List V) (g : V β†’β‚—[π•œ] W) :
                      (ofSegments π•œ l).map g = ofSegments π•œ (List.map (⇑g) l)

                      A linear image can be computed on any segment presentation.

                      @[simp]
                      theorem TauCeti.PLPath.map_id {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] (p : PLPath π•œ V) :
                      @[simp]
                      theorem TauCeti.PLPath.map_map {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} {U : Type u_2} [AddCommGroup W] [Module π•œ W] [AddCommGroup U] [Module π•œ U] (p : PLPath π•œ V) (g : V β†’β‚—[π•œ] W) (h : W β†’β‚—[π•œ] U) :
                      (p.map g).map h = p.map (h βˆ˜β‚— g)

                      Linear images respect composition.

                      @[simp]
                      theorem TauCeti.PLPath.map_one {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (g : V β†’β‚—[π•œ] W) :
                      map 1 g = 1
                      @[simp]
                      theorem TauCeti.PLPath.map_mul {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (p q : PLPath π•œ V) (g : V β†’β‚—[π•œ] W) :
                      (p * q).map g = p.map g * q.map g

                      Linear images preserve concatenation.

                      @[simp]
                      theorem TauCeti.PLPath.map_straight {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (v : V) (g : V β†’β‚—[π•œ] W) :
                      (straight π•œ v).map g = straight π•œ (g v)
                      @[simp]
                      theorem TauCeti.PLPath.endpoint_map {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (p : PLPath π•œ V) (g : V β†’β‚—[π•œ] W) :
                      @[simp]
                      theorem TauCeti.PLPath.map_reverse {π•œ : Type u} {V : Type v} [Field π•œ] [PartialOrder π•œ] [IsStrictOrderedRing π•œ] [AddCommGroup V] [Module π•œ V] {W : Type u_1} [AddCommGroup W] [Module π•œ W] (p : PLPath π•œ V) (g : V β†’β‚—[π•œ] W) :
                      p.reverse.map g = (p.map g).reverse

                      Linear images commute with reversal.