Homotopy between functions #
THIS FILE IS SYNCHRONIZED WITH MATHLIB4. Any changes to this file require a corresponding PR to mathlib4.
In this file, we define a homotopy between two functions f₀ and f₁. First we define
continuous_map.homotopy between the two functions, with no restrictions on the intermediate
maps. Then, as in the formalisation in HOL-Analysis, we define
continuous_map.homotopy_with f₀ f₁ P, for homotopies between f₀ and f₁, where the
intermediate maps satisfy the predicate P. Finally, we define
continuous_map.homotopy_rel f₀ f₁ S, for homotopies between f₀ and f₁ which are fixed
on S.
Definitions #
continuous_map.homotopy f₀ f₁is the type of homotopies betweenf₀andf₁.continuous_map.homotopy_with f₀ f₁ Pis the type of homotopies betweenf₀andf₁, where the intermediate maps satisfy the predicateP.continuous_map.homotopy_rel f₀ f₁ Sis the type of homotopies betweenf₀andf₁which are fixed onS.
For each of the above, we have
refl f, which is the constant homotopy fromftof.symm F, which reverses the homotopyF. For example, ifF : continuous_map.homotopy f₀ f₁, thenF.symm : continuous_map.homotopy f₁ f₀.trans F G, which concatenates the homotopiesFandG. For example, ifF : continuous_map.homotopy f₀ f₁andG : continuous_map.homotopy f₁ f₂, thenF.trans G : continuous_map.homotopy f₀ f₂.
We also define the relations
continuous_map.homotopic f₀ f₁is defined to benonempty (continuous_map.homotopy f₀ f₁)continuous_map.homotopic_with f₀ f₁ Pis defined to benonempty (continuous_map.homotopy_with f₀ f₁ P)continuous_map.homotopic_rel f₀ f₁ Pis defined to benonempty (continuous_map.homotopy_rel f₀ f₁ P)
and for continuous_map.homotopic and continuous_map.homotopic_rel, we also define the
setoid and quotient in C(X, Y) by these relations.
References #
- to_continuous_map : C(↥unit_interval × X, Y)
- map_zero_left' : ∀ (x : X), self.to_continuous_map.to_fun (0, x) = ⇑f₀ x
- map_one_left' : ∀ (x : X), self.to_continuous_map.to_fun (1, x) = ⇑f₁ x
continuous_map.homotopy f₀ f₁ is the type of homotopies from f₀ to f₁.
When possible, instead of parametrizing results over (f : homotopy f₀ f₁),
you should parametrize over {F : Type*} [homotopy_like F f₀ f₁] (f : F).
When you extend this structure, make sure to extend continuous_map.homotopy_like.
Instances for continuous_map.homotopy
- continuous_map.homotopy.has_sizeof_inst
- continuous_map.homotopy.continuous_map.homotopy_like
- continuous_map.homotopy.has_coe_to_fun
- continuous_map.homotopy.inhabited
- coe : F → Π (a : ↥unit_interval × X), (λ (_x : ↥unit_interval × X), Y) a
- coe_injective' : function.injective continuous_map.homotopy_like.coe
- map_continuous : ∀ (f : F), continuous ⇑f
- map_zero_left : ∀ (f : F) (x : X), ⇑f (0, x) = ⇑f₀ x
- map_one_left : ∀ (f : F) (x : X), ⇑f (1, x) = ⇑f₁ x
continuous_map.homotopy_like F f₀ f₁ states that F is a type of homotopies between f₀ and
f₁.
You should extend this class when you extend continuous_map.homotopy.
Instances of this typeclass
Instances of other typeclasses for continuous_map.homotopy_like
- continuous_map.homotopy_like.has_sizeof_inst
Equations
- continuous_map.homotopy.continuous_map.homotopy_like = {coe := λ (f : f₀.homotopy f₁), f.to_continuous_map.to_fun, coe_injective' := _, map_continuous := _, map_zero_left := _, map_one_left := _}
Helper instance for when there's too many metavariables to apply fun_like.has_coe_to_fun
directly.
See Note [custom simps projection]. We need to specify this projection explicitly in this case, because it is a composition of multiple projections.
Equations
Deprecated. Use map_continuous instead.
Currying a homotopy to a continuous function fron I to C(X, Y).
Equations
- F.curry = F.to_continuous_map.curry
Continuously extending a curried homotopy to a function from ℝ to C(X, Y).
Equations
- F.extend = continuous_map.Icc_extend continuous_map.homotopy.extend._proof_1 F.curry
Given a continuous function f, we can define a homotopy f f by F (t, x) = f x
Equations
- continuous_map.homotopy.refl f = {to_continuous_map := {to_fun := λ (x : ↥unit_interval × X), ⇑f x.snd, continuous_to_fun := _}, map_zero_left' := _, map_one_left' := _}
Equations
Given a homotopy f₀ f₁, we can define a homotopy f₁ f₀ by reversing the homotopy.
Equations
- F.symm = {to_continuous_map := {to_fun := λ (x : ↥unit_interval × X), ⇑F (unit_interval.symm x.fst, x.snd), continuous_to_fun := _}, map_zero_left' := _, map_one_left' := _}
Given homotopy f₀ f₁ and homotopy f₁ f₂, we can define a homotopy f₀ f₂ by putting the first
homotopy on [0, 1/2] and the second on [1/2, 1].
Casting a homotopy f₀ f₁ to a homotopy g₀ g₁ where f₀ = g₀ and f₁ = g₁.
Equations
- F.cast h₀ h₁ = {to_continuous_map := {to_fun := ⇑F, continuous_to_fun := _}, map_zero_left' := _, map_one_left' := _}
If we have a homotopy f₀ f₁ and a homotopy g₀ g₁, then we can compose them and get a
homotopy (g₀.comp f₀) (g₁.comp f₁).
Equations
- F.hcomp G = {to_continuous_map := {to_fun := λ (x : ↥unit_interval × X), ⇑G (x.fst, ⇑F x), continuous_to_fun := _}, map_zero_left' := _, map_one_left' := _}
Given continuous maps f₀ and f₁, we say f₀ and f₁ are homotopic if there exists a
homotopy f₀ f₁.
- to_homotopy : f₀.homotopy f₁
- prop' : ∀ (t : ↥unit_interval), P {to_fun := λ (x : X), self.to_homotopy.to_continuous_map.to_fun (t, x), continuous_to_fun := _}
The type of homotopies between f₀ f₁ : C(X, Y), where the intermediate maps satisfy the predicate
P : C(X, Y) → Prop
Instances for continuous_map.homotopy_with
- continuous_map.homotopy_with.has_sizeof_inst
- continuous_map.homotopy_with.has_coe_to_fun
- continuous_map.homotopy_with.inhabited
- path.homotopy.has_coe_to_fun
Equations
- continuous_map.homotopy_with.has_coe_to_fun = {coe := λ (F : f₀.homotopy_with f₁ P), F.to_homotopy.to_continuous_map.to_fun}
See Note [custom simps projection]. We need to specify this projection explicitly in this case, because it is a composition of multiple projections.
Equations
Given a continuous function f, and a proof h : P f, we can define a homotopy_with f f P by
F (t, x) = f x
Equations
- continuous_map.homotopy_with.refl f hf = {to_homotopy := {to_continuous_map := (continuous_map.homotopy.refl f).to_continuous_map, map_zero_left' := _, map_one_left' := _}, prop' := _}
Given a homotopy_with f₀ f₁ P, we can define a homotopy_with f₁ f₀ P by reversing the homotopy.
Equations
- F.symm = {to_homotopy := {to_continuous_map := F.to_homotopy.symm.to_continuous_map, map_zero_left' := _, map_one_left' := _}, prop' := _}
Given homotopy_with f₀ f₁ P and homotopy_with f₁ f₂ P, we can define a homotopy_with f₀ f₂ P
by putting the first homotopy on [0, 1/2] and the second on [1/2, 1].
Equations
- F.trans G = {to_homotopy := {to_continuous_map := (F.to_homotopy.trans G.to_homotopy).to_continuous_map, map_zero_left' := _, map_one_left' := _}, prop' := _}
Casting a homotopy_with f₀ f₁ P to a homotopy_with g₀ g₁ P where f₀ = g₀ and f₁ = g₁.
Equations
- F.cast h₀ h₁ = {to_homotopy := {to_continuous_map := (F.to_homotopy.cast h₀ h₁).to_continuous_map, map_zero_left' := _, map_one_left' := _}, prop' := _}
Given continuous maps f₀ and f₁, we say f₀ and f₁ are homotopic with respect to the
predicate P if there exists a homotopy_with f₀ f₁ P.
Equations
- f₀.homotopic_with f₁ P = nonempty (f₀.homotopy_with f₁ P)
A homotopy_rel f₀ f₁ S is a homotopy between f₀ and f₁ which is fixed on the points in S.
Given a map f : C(X, Y) and a set S, we can define a homotopy_rel f f S by setting
F (t, x) = f x for all t. This is defined using homotopy_with.refl, but with the proof
filled in.
Equations
Given a homotopy_rel f₀ f₁ S, we can define a homotopy_rel f₁ f₀ S by reversing the homotopy.
Equations
- F.symm = {to_homotopy := (continuous_map.homotopy_with.symm F).to_homotopy, prop' := _}
Given homotopy_rel f₀ f₁ S and homotopy_rel f₁ f₂ S, we can define a homotopy_rel f₀ f₂ S
by putting the first homotopy on [0, 1/2] and the second on [1/2, 1].
Equations
- F.trans G = {to_homotopy := {to_continuous_map := (F.to_homotopy.trans G.to_homotopy).to_continuous_map, map_zero_left' := _, map_one_left' := _}, prop' := _}
Casting a homotopy_rel f₀ f₁ S to a homotopy_rel g₀ g₁ S where f₀ = g₀ and f₁ = g₁.
Equations
- F.cast h₀ h₁ = {to_homotopy := {to_continuous_map := (F.to_homotopy.cast h₀ h₁).to_continuous_map, map_zero_left' := _, map_one_left' := _}, prop' := _}
Given continuous maps f₀ and f₁, we say f₀ and f₁ are homotopic relative to a set S if
there exists a homotopy_rel f₀ f₁ S.
Equations
- f₀.homotopic_rel f₁ S = nonempty (f₀.homotopy_rel f₁ S)