@@ -6,6 +6,7 @@ Authors: Jean Lo
66import Mathlib.Logic.Function.Iterate
77import Mathlib.Topology.Algebra.Monoid
88import Mathlib.Topology.Algebra.Group.Defs
9+ import Mathlib.Algebra.Order.Monoid.Submonoid
910
1011/-!
1112# Flows and invariant sets
@@ -22,9 +23,9 @@ if `ϕₜ s ⊆ s` for all `t`. In many cases `ϕ` will be a flow on
2223commutative) monoid, we additionally define forward invariance, where
2324`t` ranges over those elements which are nonnegative.
2425
25- Additionally, we define such constructions as the restriction of a
26- flow onto an invariant subset, and the time-reversal of a flow by a
27- group.
26+ Additionally, we define such constructions as the (forward) orbit, a
27+ semiconjugacy between flows, a factor of a flow, the restriction of a
28+ flow onto an invariant subset, and the time-reversal of a flow by a group.
2829-/
2930
3031
@@ -47,24 +48,35 @@ theorem isInvariant_iff_image : IsInvariant ϕ s ↔ ∀ t, ϕ t '' s ⊆ s := b
4748 simp_rw [IsInvariant, mapsTo_iff_image_subset]
4849
4950/-- A set `s ⊆ α` is forward-invariant under `ϕ : τ → α → α` if `ϕ t s ⊆ s` for all `t ≥ 0`. -/
50- def IsFwInvariant [Preorder τ] [Zero τ] (ϕ : τ → α → α) (s : Set α) : Prop :=
51+ def IsForwardInvariant [Preorder τ] [Zero τ] (ϕ : τ → α → α) (s : Set α) : Prop :=
5152 ∀ ⦃t⦄, 0 ≤ t → MapsTo (ϕ t) s s
5253
53- theorem IsInvariant.isFwInvariant [Preorder τ] [Zero τ] {ϕ : τ → α → α} {s : Set α}
54- (h : IsInvariant ϕ s) : IsFwInvariant ϕ s := fun t _ht => h t
54+ @ [deprecated (since := "2025-09-25" )] alias IsFwInvariant := IsForwardInvariant
55+
56+ theorem IsInvariant.isForwardInvariant [Preorder τ] [Zero τ] {ϕ : τ → α → α} {s : Set α}
57+ (h : IsInvariant ϕ s) : IsForwardInvariant ϕ s := fun t _ht => h t
58+
59+ @ [deprecated (since := "2025-09-25" )]
60+ alias IsInvariant.isFwInvariant := IsInvariant.isForwardInvariant
5561
5662/-- If `τ` is a `CanonicallyOrderedAdd` monoid (e.g., `ℕ` or `ℝ≥0`), then the notions
57- `IsFwInvariant ` and `IsInvariant` are equivalent. -/
58- theorem IsFwInvariant .isInvariant [AddMonoid τ] [PartialOrder τ] [CanonicallyOrderedAdd τ]
63+ `IsForwardInvariant ` and `IsInvariant` are equivalent. -/
64+ theorem IsForwardInvariant .isInvariant [AddMonoid τ] [PartialOrder τ] [CanonicallyOrderedAdd τ]
5965 {ϕ : τ → α → α} {s : Set α}
60- (h : IsFwInvariant ϕ s) : IsInvariant ϕ s := fun t => h (zero_le t)
66+ (h : IsForwardInvariant ϕ s) : IsInvariant ϕ s := fun t => h (zero_le t)
67+
68+ @ [deprecated (since := "2025-09-25" )]
69+ alias IsFwInvariant.isInvariant := IsForwardInvariant.isInvariant
6170
6271/-- If `τ` is a `CanonicallyOrderedAdd` monoid (e.g., `ℕ` or `ℝ≥0`), then the notions
63- `IsFwInvariant ` and `IsInvariant` are equivalent. -/
64- theorem isFwInvariant_iff_isInvariant [AddMonoid τ] [PartialOrder τ] [CanonicallyOrderedAdd τ]
72+ `IsForwardInvariant ` and `IsInvariant` are equivalent. -/
73+ theorem isForwardInvariant_iff_isInvariant [AddMonoid τ] [PartialOrder τ] [CanonicallyOrderedAdd τ]
6574 {ϕ : τ → α → α} {s : Set α} :
66- IsFwInvariant ϕ s ↔ IsInvariant ϕ s :=
67- ⟨IsFwInvariant.isInvariant, IsInvariant.isFwInvariant⟩
75+ IsForwardInvariant ϕ s ↔ IsInvariant ϕ s :=
76+ ⟨IsForwardInvariant.isInvariant, IsInvariant.isForwardInvariant⟩
77+
78+ @ [deprecated (since := "2025-09-25" )]
79+ alias isFwInvariant_iff_isInvariant := isForwardInvariant_iff_isInvariant
6880
6981end Invariant
7082
@@ -131,6 +143,109 @@ def restrict {s : Set α} (h : IsInvariant ϕ s) : Flow τ (↥s) where
131143 map_add' _ _ _ := Subtype.ext (map_add _ _ _ _)
132144 map_zero' _ := Subtype.ext (map_zero_apply _ _)
133145
146+ @[simp]
147+ theorem coe_restrict_apply {s : Set α} (h : IsInvariant ϕ s) (t : τ) (x : s) :
148+ restrict ϕ h t x = ϕ t x := rfl
149+
150+ /-- Convert a flow to an additive monoid action. -/
151+ def toAddAction : AddAction τ α where
152+ vadd := ϕ
153+ add_vadd := ϕ.map_add'
154+ zero_vadd := ϕ.map_zero'
155+
156+ /-- Restrict a flow by `τ` to a flow by an additive submonoid of `τ`. -/
157+ def restrictAddSubmonoid (S : AddSubmonoid τ) : Flow S α where
158+ toFun t x := ϕ t x
159+ cont' := ϕ.continuous (continuous_subtype_val.comp continuous_fst) continuous_snd
160+ map_add' t₁ t₂ x := ϕ.map_add' t₁ t₂ x
161+ map_zero' := ϕ.map_zero'
162+
163+ theorem restrictAddSubmonoid_apply (S : AddSubmonoid τ) (t : S) (x : α) :
164+ restrictAddSubmonoid ϕ S t x = ϕ t x := rfl
165+
166+ section Orbit
167+
168+ /-- The orbit of a point under a flow. -/
169+ def orbit (x : α) : Set α := ϕ.toAddAction.orbit _ x
170+
171+ theorem orbit_eq_range (x : α) : orbit ϕ x = Set.range (fun t => ϕ t x) := rfl
172+
173+ theorem mem_orbit_iff {x₁ x₂ : α} : x₂ ∈ orbit ϕ x₁ ↔ ∃ t : τ, ϕ t x₁ = x₂ :=
174+ ϕ.toAddAction.mem_orbit_iff
175+
176+ theorem mem_orbit (x : α) (t : τ) : ϕ t x ∈ orbit ϕ x := ϕ.toAddAction.mem_orbit ..
177+
178+ theorem mem_orbit_self (x : α) : x ∈ orbit ϕ x := ϕ.toAddAction.mem_orbit_self x
179+
180+ theorem nonempty_orbit (x : α) : Set.Nonempty (orbit ϕ x) := ϕ.toAddAction.nonempty_orbit x
181+
182+ theorem mem_orbit_of_mem_orbit {x₁ x₂ : α} (t : τ) (h : x₂ ∈ orbit ϕ x₁) : ϕ t x₂ ∈ orbit ϕ x₁ :=
183+ ϕ.toAddAction.mem_orbit_of_mem_orbit t h
184+
185+ /-- The orbit of a point under a flow `ϕ` is invariant under `ϕ`. -/
186+ theorem isInvariant_orbit (x : α) : IsInvariant ϕ (orbit ϕ x) :=
187+ fun t _ => ϕ.toAddAction.mem_orbit_of_mem_orbit t
188+
189+ theorem orbit_restrict (s : Set α) (hs : IsInvariant ϕ s) (x : s) :
190+ orbit (ϕ.restrict hs) x = Subtype.val ⁻¹' orbit ϕ x :=
191+ Set.ext (fun x => by simp [orbit_eq_range, Subtype.ext_iff])
192+
193+ variable [Preorder τ] [AddLeftMono τ]
194+
195+ /-- Restrict a flow by `τ` to a flow by the additive submonoid of nonnegative elements of `τ`. -/
196+ def restrictNonneg : Flow (AddSubmonoid.nonneg τ) α := ϕ.restrictAddSubmonoid (.nonneg τ)
197+
198+ /-- The forward orbit of a point under a flow. -/
199+ def forwardOrbit (x : α) : Set α := orbit ϕ.restrictNonneg x
200+
201+ theorem forwardOrbit_eq_range_nonneg (x : α) :
202+ forwardOrbit ϕ x = Set.range (fun t : {t : τ // 0 ≤ t} => ϕ t x) := rfl
203+
204+ /-- The forward orbit of a point under a flow `ϕ` is forward-invariant under `ϕ`. -/
205+ theorem isForwardInvariant_forwardOrbit (x : α) : IsForwardInvariant ϕ (forwardOrbit ϕ x) :=
206+ fun t h => IsInvariant.isForwardInvariant (isInvariant_orbit ϕ.restrictNonneg x) (t := ⟨t, h⟩) h
207+
208+ /-- The forward orbit of a point `x` is contained in the orbit of `x`. -/
209+ theorem forwardOrbit_subset_orbit (x : α) : forwardOrbit ϕ x ⊆ orbit ϕ x :=
210+ ϕ.toAddAction.orbit_addSubmonoid_subset (AddSubmonoid.nonneg τ) x
211+
212+ theorem mem_orbit_of_mem_forwardOrbit {x₁ x₂ : α} (h : x₁ ∈ forwardOrbit ϕ x₂) : x₁ ∈ orbit ϕ x₂ :=
213+ ϕ.forwardOrbit_subset_orbit x₂ h
214+
215+ end Orbit
216+
217+ variable {β γ : Type *} [TopologicalSpace β] [TopologicalSpace γ] (ψ : Flow τ β) (χ : Flow τ γ)
218+
219+ /-- Given flows `ϕ` by `τ` on `α` and `ψ` by `τ` on `β`, a function `π : α → β` is called a
220+ *semiconjugacy* from `ϕ` to `ψ` if `π` is continuous and surjective, and `π ∘ (ϕ t) = (ψ t) ∘ π` for
221+ all `t : τ`. -/
222+ structure IsSemiconjugacy (π : α → β) (ϕ : Flow τ α) (ψ : Flow τ β) : Prop where
223+ cont : Continuous π
224+ surj : Function.Surjective π
225+ semiconj : ∀ t, Function.Semiconj π (ϕ t) (ψ t)
226+
227+ /-- The composition of semiconjugacies is a semiconjugacy. -/
228+ theorem IsSemiconjugacy.comp {π : α → β} {ρ : β → γ}
229+ (h₁ : IsSemiconjugacy π ϕ ψ) (h₂ : IsSemiconjugacy ρ ψ χ) : IsSemiconjugacy (ρ ∘ π) ϕ χ :=
230+ ⟨h₂.cont.comp h₁.cont, h₂.surj.comp h₁.surj, fun t => (h₂.semiconj t).comp_left (h₁.semiconj t)⟩
231+
232+ /-- The identity is a semiconjugacy from `ϕ` to `ψ` if and only if `ϕ` and `ψ` are equal. -/
233+ theorem isSemiconjugacy_id_iff_eq (ϕ ψ : Flow τ α) : IsSemiconjugacy id ϕ ψ ↔ ϕ = ψ :=
234+ ⟨fun h => ext h.semiconj, fun h => h.recOn ⟨continuous_id, surjective_id, fun _ => .id_left⟩⟩
235+
236+ /-- A flow `ψ` is called a *factor* of `ϕ` if there exists a semiconjugacy from `ϕ` to `ψ`. -/
237+ def IsFactorOf (ψ : Flow τ β) (ϕ : Flow τ α) : Prop := ∃ π : α → β, IsSemiconjugacy π ϕ ψ
238+
239+ theorem IsSemiconjugacy.isFactorOf {π : α → β} (h : IsSemiconjugacy π ϕ ψ) : IsFactorOf ψ ϕ :=
240+ ⟨π, h⟩
241+
242+ /-- Transitivity of factors of flows. -/
243+ theorem IsFactorOf.trans (h₁ : IsFactorOf ϕ ψ) (h₂ : IsFactorOf ψ χ) : IsFactorOf ϕ χ :=
244+ h₁.elim fun π hπ => h₂.elim fun ρ hρ => ⟨π ∘ ρ, hρ.comp χ ψ ϕ hπ⟩
245+
246+ /-- Every flow is a factor of itself. -/
247+ theorem IsFactorOf.self : IsFactorOf ϕ ϕ := ⟨id, (isSemiconjugacy_id_iff_eq ϕ ϕ).mpr (by rfl)⟩
248+
134249end Flow
135250
136251namespace Flow
0 commit comments