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₁ P
is the type of homotopies betweenf₀
andf₁
, where the intermediate maps satisfy the predicateP
.continuous_map.homotopy_rel f₀ f₁ S
is the type of homotopies betweenf₀
andf₁
which are fixed onS
.
For each of the above, we have
refl f
, which is the constant homotopy fromf
tof
.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 homotopiesF
andG
. 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₁ P
is defined to benonempty (continuous_map.homotopy_with f₀ f₁ P)
continuous_map.homotopic_rel f₀ f₁ P
is 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)