Homotopy between functions #
In this file, we define a homotopy between two functions f₀
and f₁
. First we define
ContinuousMap.Homotopy
between the two functions, with no restrictions on the intermediate
maps. Then, as in the formalisation in HOL-Analysis, we define
ContinuousMap.HomotopyWith f₀ f₁ P
, for homotopies between f₀
and f₁
, where the
intermediate maps satisfy the predicate P
. Finally, we define
ContinuousMap.HomotopyRel f₀ f₁ S
, for homotopies between f₀
and f₁
which are fixed
on S
.
Definitions #
ContinuousMap.Homotopy f₀ f₁
is the type of homotopies betweenf₀
andf₁
.ContinuousMap.HomotopyWith f₀ f₁ P
is the type of homotopies betweenf₀
andf₁
, where the intermediate maps satisfy the predicateP
.ContinuousMap.HomotopyRel 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 : ContinuousMap.Homotopy f₀ f₁
, thenF.symm : ContinuousMap.Homotopy f₁ f₀
.trans F G
, which concatenates the homotopiesF
andG
. For example, ifF : ContinuousMap.Homotopy f₀ f₁
andG : ContinuousMap.Homotopy f₁ f₂
, thenF.trans G : ContinuousMap.Homotopy f₀ f₂
.
We also define the relations
ContinuousMap.Homotopic f₀ f₁
is defined to beNonempty (ContinuousMap.Homotopy f₀ f₁)
ContinuousMap.HomotopicWith f₀ f₁ P
is defined to beNonempty (ContinuousMap.HomotopyWith f₀ f₁ P)
ContinuousMap.HomotopicRel f₀ f₁ P
is defined to beNonempty (ContinuousMap.HomotopyRel f₀ f₁ P)
and for ContinuousMap.homotopic
and ContinuousMap.homotopic_rel
, we also define the
setoid
and quotient
in C(X, Y)
by these relations.
References #
ContinuousMap.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*} [HomotopyLike F f₀ f₁] (f : F)
.
When you extend this structure, make sure to extend ContinuousMap.HomotopyLike
.
- toFun : ↑unitInterval × X → Y
- continuous_toFun : Continuous self.toFun
- map_zero_left : ∀ (x : X), self.toFun (0, x) = f₀ x
value of the homotopy at 0
- map_one_left : ∀ (x : X), self.toFun (1, x) = f₁ x
value of the homotopy at 1
Instances For
ContinuousMap.HomotopyLike F f₀ f₁
states that F
is a type of homotopies between f₀
and
f₁
.
You should extend this class when you extend ContinuousMap.Homotopy
.
- map_continuous : ∀ (f : F), Continuous ⇑f
- map_zero_left : ∀ (f : F) (x : X), f (0, x) = f₀ x
value of the homotopy at 0
- map_one_left : ∀ (f : F) (x : X), f (1, x) = f₁ x
value of the homotopy at 1
Instances
Equations
- ContinuousMap.Homotopy.instFunLike = { coe := fun (f : f₀.Homotopy f₁) => f.toFun, coe_injective' := ⋯ }
Equations
- ⋯ = ⋯
See Note [custom simps projection]. We need to specify this projection explicitly in this case, because it is a composition of multiple projections.
Equations
Instances For
Deprecated. Use map_continuous
instead.
Currying a homotopy to a continuous function from I
to C(X, Y)
.
Equations
- F.curry = F.curry
Instances For
Continuously extending a curried homotopy to a function from ℝ
to C(X, Y)
.
Equations
- F.extend = ContinuousMap.IccExtend ContinuousMap.Homotopy.extend.proof_1 F.curry
Instances For
Given a continuous function f
, we can define a Homotopy f f
by F (t, x) = f x
Equations
- ContinuousMap.Homotopy.refl f = { toFun := fun (x : ↑unitInterval × X) => f x.2, continuous_toFun := ⋯, map_zero_left := ⋯, map_one_left := ⋯ }
Instances For
Equations
- ContinuousMap.Homotopy.instInhabitedId = { default := ContinuousMap.Homotopy.refl (ContinuousMap.id X) }
Given a Homotopy f₀ f₁
, we can define a Homotopy f₁ f₀
by reversing the homotopy.
Equations
- F.symm = { toFun := fun (x : ↑unitInterval × X) => F (unitInterval.symm x.1, x.2), continuous_toFun := ⋯, map_zero_left := ⋯, map_one_left := ⋯ }
Instances For
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]
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Casting a Homotopy f₀ f₁
to a Homotopy g₀ g₁
where f₀ = g₀
and f₁ = g₁
.
Equations
- F.cast h₀ h₁ = { toFun := ⇑F, continuous_toFun := ⋯, map_zero_left := ⋯, map_one_left := ⋯ }
Instances For
Composition of a Homotopy g₀ g₁
and f : C(X, Y)
as a homotopy between g₀.comp f
and
g₁.comp f
.
Equations
- G.compContinuousMap f = { toContinuousMap := G.comp ((ContinuousMap.id ↑unitInterval).prodMap f), map_zero_left := ⋯, map_one_left := ⋯ }
Instances For
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 = { toFun := fun (x : ↑unitInterval × X) => G (x.1, F x), continuous_toFun := ⋯, map_zero_left := ⋯, map_one_left := ⋯ }
Instances For
Let F
be a homotopy between f₀ : C(X, Y)
and f₁ : C(X, Y)
. Let G
be a homotopy between
g₀ : C(X, Z)
and g₁ : C(X, Z)
. Then F.prodMk G
is the homotopy between f₀.prodMk g₀
and
f₁.prodMk g₁
that sends p
to (F p, G p)
.
Equations
- F.prodMk G = { toContinuousMap := F.prodMk ↑G, map_zero_left := ⋯, map_one_left := ⋯ }
Instances For
Let F
be a homotopy between f₀ : C(X, Y)
and f₁ : C(X, Y)
. Let G
be a homotopy between
g₀ : C(Z, Z')
and g₁ : C(Z, Z')
. Then F.prodMap G
is the homotopy between f₀.prodMap g₀
and
f₁.prodMap g₁
that sends (t, x, z)
to (F (t, x), G (t, z))
.
Equations
- F.prodMap G = ((ContinuousMap.Homotopy.refl ContinuousMap.fst).hcomp F).prodMk ((ContinuousMap.Homotopy.refl ContinuousMap.snd).hcomp G)
Instances For
Given a family of homotopies F i
between f₀ i : C(X, Y i)
and f₁ i : C(X, Y i)
, returns a
homotopy between ContinuousMap.pi f₀
and ContinuousMap.pi f₁
.
Equations
- ContinuousMap.Homotopy.pi F = { toContinuousMap := ContinuousMap.pi fun (i : ι) => ↑(F i), map_zero_left := ⋯, map_one_left := ⋯ }
Instances For
Given a family of homotopies F i
between f₀ i : C(X i, Y i)
and f₁ i : C(X i, Y i)
,
returns a homotopy between ContinuousMap.piMap f₀
and ContinuousMap.piMap f₁
.
Equations
- ContinuousMap.Homotopy.piMap F = ContinuousMap.Homotopy.pi fun (i : ι) => (ContinuousMap.Homotopy.refl (ContinuousMap.eval i)).hcomp (F i)
Instances For
Given continuous maps f₀
and f₁
, we say f₀
and f₁
are homotopic if there exists a
Homotopy f₀ f₁
.
Instances For
If each f₀ i : C(X, Y i)
is homotopic to f₁ i : C(X, Y i)
, then ContinuousMap.pi f₀
is
homotopic to ContinuousMap.pi f₁
.
If each f₀ i : C(X, Y i)
is homotopic to f₁ i : C(X, Y i)
, then ContinuousMap.pi f₀
is
homotopic to ContinuousMap.pi f₁
.
The type of homotopies between f₀ f₁ : C(X, Y)
, where the intermediate maps satisfy the predicate
P : C(X, Y) → Prop
- toFun : ↑unitInterval × X → Y
- continuous_toFun : Continuous self.toFun
- map_zero_left : ∀ (x : X), self.toFun (0, x) = f₀ x
- map_one_left : ∀ (x : X), self.toFun (1, x) = f₁ x
- prop' : ∀ (t : ↑unitInterval), P { toFun := fun (x : X) => self.toFun (t, x), continuous_toFun := ⋯ }
the intermediate maps of the homotopy satisfy the property
Instances For
Equations
- ContinuousMap.HomotopyWith.instFunLike = { coe := fun (F : f₀.HomotopyWith f₁ P) => ⇑F.toHomotopy, coe_injective' := ⋯ }
Equations
- ⋯ = ⋯
See Note [custom simps projection]. We need to specify this projection explicitly in this case, because it is a composition of multiple projections.
Equations
Instances For
Given a continuous function f
, and a proof h : P f
, we can define a HomotopyWith f f P
by
F (t, x) = f x
Equations
- ContinuousMap.HomotopyWith.refl f hf = { toHomotopy := ContinuousMap.Homotopy.refl f, prop' := ⋯ }
Instances For
Equations
- ContinuousMap.HomotopyWith.instInhabitedIdTrue = { default := ContinuousMap.HomotopyWith.refl (ContinuousMap.id X) trivial }
Given a HomotopyWith f₀ f₁ P
, we can define a HomotopyWith f₁ f₀ P
by reversing the homotopy.
Equations
- F.symm = { toHomotopy := F.symm, prop' := ⋯ }
Instances For
Given HomotopyWith f₀ f₁ P
and HomotopyWith f₁ f₂ P
, we can define a HomotopyWith f₀ f₂ P
by putting the first homotopy on [0, 1/2]
and the second on [1/2, 1]
.
Equations
- F.trans G = { toHomotopy := F.trans G.toHomotopy, prop' := ⋯ }
Instances For
Casting a HomotopyWith f₀ f₁ P
to a HomotopyWith g₀ g₁ P
where f₀ = g₀
and f₁ = g₁
.
Equations
- F.cast h₀ h₁ = { toHomotopy := F.cast h₀ h₁, prop' := ⋯ }
Instances For
Given continuous maps f₀
and f₁
, we say f₀
and f₁
are homotopic with respect to the
predicate P
if there exists a HomotopyWith f₀ f₁ P
.
Instances For
A HomotopyRel f₀ f₁ S
is a homotopy between f₀
and f₁
which is fixed on the points in S
.
Instances For
Given a map f : C(X, Y)
and a set S
, we can define a HomotopyRel f f S
by setting
F (t, x) = f x
for all t
. This is defined using HomotopyWith.refl
, but with the proof
filled in.
Equations
Instances For
Given a HomotopyRel f₀ f₁ S
, we can define a HomotopyRel f₁ f₀ S
by reversing the homotopy.
Equations
- F.symm = { toHomotopy := F.symm, prop' := ⋯ }
Instances For
Given HomotopyRel f₀ f₁ S
and HomotopyRel f₁ f₂ S
, we can define a HomotopyRel f₀ f₂ S
by putting the first homotopy on [0, 1/2]
and the second on [1/2, 1]
.
Equations
- F.trans G = { toHomotopy := F.trans G.toHomotopy, prop' := ⋯ }
Instances For
Casting a HomotopyRel f₀ f₁ S
to a HomotopyRel g₀ g₁ S
where f₀ = g₀
and f₁ = g₁
.
Equations
- F.cast h₀ h₁ = { toHomotopy := F.cast h₀ h₁, prop' := ⋯ }
Instances For
Post-compose a homotopy relative to a set by a continuous function.
Equations
- F.compContinuousMap g = { toHomotopy := F.hcomp (ContinuousMap.Homotopy.refl g), prop' := ⋯ }
Instances For
Given continuous maps f₀
and f₁
, we say f₀
and f₁
are homotopic relative to a set S
if
there exists a HomotopyRel f₀ f₁ S
.
Instances For
If two maps are homotopic relative to a set, then they are homotopic.