Skip to content

Commit

Permalink
bipointed and paths (math-comp#1400)
Browse files Browse the repository at this point in the history
* bipointed and paths

---------

Co-authored-by: Reynald Affeldt <[email protected]>
  • Loading branch information
zstone1 and affeldt-aist authored Nov 21, 2024
1 parent 33c087a commit 71b1296
Show file tree
Hide file tree
Showing 8 changed files with 236 additions and 0 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG_UNRELEASED.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,13 @@
- in `boolp.v`:
+ lemmas `existT_inj1`, `surjective_existT`

- in file `homotopy_theory/path.v`,
+ new definitions `reparameterize`, `mk_path`, and `chain_path`.
+ new lemmas `path_eqP`, and `chain_path_cts_point`.
- in file `homotopy_theory/wedge_sigT.v`,
+ new definition `bpwedge_shared_pt`.
+ new notations `bpwedge`, and `bpwedge_lift`.

### Changed

- in file `normedtype.v`,
Expand Down
1 change: 1 addition & 0 deletions _CoqProject
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ theories/topology_theory/sigT_topology.v

theories/homotopy_theory/homotopy.v
theories/homotopy_theory/wedge_sigT.v
theories/homotopy_theory/path.v

theories/separation_axioms.v
theories/function_spaces.v
Expand Down
10 changes: 10 additions & 0 deletions classical/classical_sets.v
Original file line number Diff line number Diff line change
Expand Up @@ -2485,6 +2485,16 @@ Proof. by apply/eqP => /seteqP[] /(_ point) /(_ Logic.I). Qed.

End PointedTheory.

HB.mixin Record isBiPointed (X : Type) of Equality X := {
zero : X;
one : X;
zero_one_neq : zero != one;
}.

#[short(type="biPointedType")]
HB.structure Definition BiPointed :=
{ X of Choice X & isBiPointed X }.

Variant squashed T : Prop := squash (x : T).
Arguments squash {T} x.
Notation "$| T |" := (squashed T) : form_scope.
Expand Down
1 change: 1 addition & 0 deletions theories/Make
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ topology_theory/sigT_topology.v

homotopy_theory/homotopy.v
homotopy_theory/wedge_sigT.v
homotopy_theory/path.v

separation_axioms.v
function_spaces.v
Expand Down
1 change: 1 addition & 0 deletions theories/homotopy_theory/homotopy.v
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
(* mathcomp analysis (c) 2024 Inria and AIST. License: CeCILL-C. *)
From mathcomp Require Export wedge_sigT.
From mathcomp Require Export path.
181 changes: 181 additions & 0 deletions theories/homotopy_theory/path.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
(* mathcomp analysis (c) 2024 Inria and AIST. License: CeCILL-C. *)
From HB Require Import structures.
From mathcomp Require Import all_ssreflect all_algebra finmap generic_quotient.
From mathcomp Require Import mathcomp_extra boolp classical_sets functions.
From mathcomp Require Import cardinality fsbigop reals signed topology.
From mathcomp Require Import function_spaces wedge_sigT.

(**md**************************************************************************)
(* # Paths *)
(* Paths from biPointed spaces. *)
(* *)
(* ``` *)
(* mk_path ctsf f0 f1 == constructs a value in `pathType x y` given proofs *)
(* that the endpoints of `f` are `x` and `y` *)
(* reparameterize f phi == the path `f` with a different parameterization *)
(* chain_path f g == the path which follows f, then follows g *)
(* Only makes sense when `f one = g zero`. The *)
(* domain is the wedge of domains of `f` and `g`. *)
(* ``` *)
(* The type `{path i from x to y in T}` is the continuous functions on the *)
(* bipointed space i that go from x to y staying in T. It is endowed with *)
(* - Topology via the compact-open topology *)
(* *)
(******************************************************************************)

Set Implicit Arguments.
Unset Strict Implicit.
Unset Printing Implicit Defensive.

Reserved Notation "{ 'path' i 'from' x 'to' y }" (
at level 0, i at level 69, x at level 69, y at level 69,
only parsing,
format "{ 'path' i 'from' x 'to' y }").
Reserved Notation "{ 'path' i 'from' x 'to' y 'in' T }" (
at level 0, i at level 69, x at level 69, y at level 69, T at level 69,
format "{ 'path' i 'from' x 'to' y 'in' T }").

Local Open Scope classical_set_scope.
Local Open Scope ring_scope.
Local Open Scope quotient_scope.

HB.mixin Record isPath {i : bpTopologicalType} {T : topologicalType} (x y : T)
(f : i -> T) of isContinuous i T f := {
path_zero : f zero = x;
path_one : f one = y;
}.

#[short(type="pathType")]
HB.structure Definition Path {i : bpTopologicalType} {T : topologicalType}
(x y : T) := {f of isPath i T x y f & isContinuous i T f}.

Notation "{ 'path' i 'from' x 'to' y }" := (pathType i x y) : type_scope.
Notation "{ 'path' i 'from' x 'to' y 'in' T }" :=
(@pathType i T x y) : type_scope.

HB.instance Definition _ {i : bpTopologicalType}
{T : topologicalType} (x y : T) := gen_eqMixin {path i from x to y}.
HB.instance Definition _ {i : bpTopologicalType}
{T : topologicalType} (x y : T) := gen_choiceMixin {path i from x to y}.
HB.instance Definition _ {i : bpTopologicalType}
{T : topologicalType} (x y : T) :=
Topological.copy {path i from x to y}
(@weak_topology {path i from x to y} {compact-open, i -> T} id).

Section path_eq.
Context {T : topologicalType} {i : bpTopologicalType} (x y : T).

Lemma path_eqP (a b : {path i from x to y}) : a = b <-> a =1 b.
Proof.
split=> [->//|].
move: a b => [/= f [[+ +]]] [/= g [[+ +]]] fgE.
move/funext : fgE => -> /= a1 [b1 c1] a2 [b2 c2]; congr (_ _).
rewrite (Prop_irrelevance a1 a2) (Prop_irrelevance b1 b2).
by rewrite (Prop_irrelevance c1 c2).
Qed.

End path_eq.

Section cst_path.
Context {T : topologicalType} {i : bpTopologicalType} (x: T).

HB.instance Definition _ := @isPath.Build i T x x (cst x) erefl erefl.
End cst_path.

Section path_domain_path.
Context {i : bpTopologicalType}.
HB.instance Definition _ := @isPath.Build i i zero one idfun erefl erefl.
End path_domain_path.

Section path_compose.
Context {T U : topologicalType} (i: bpTopologicalType) (x y : T).
Context (f : continuousType T U) (p : {path i from x to y}).

Local Lemma fp_zero : (f \o p) zero = f x.
Proof. by rewrite /= !path_zero. Qed.

Local Lemma fp_one : (f \o p) one = f y.
Proof. by rewrite /= !path_one. Qed.

HB.instance Definition _ := isPath.Build i U (f x) (f y) (f \o p)
fp_zero fp_one.

End path_compose.

Section path_reparameterize.
Context {T : topologicalType} (i j: bpTopologicalType) (x y : T).
Context (f : {path i from x to y}) (phi : {path j from zero to one in i}).

(* we use reparameterize, as opposed to just `\o` because we can simplify the
endpoints. So we don't end up with `f \o p : {path j from f zero to f one}`
but rather `{path j from zero to one}`
*)
Definition reparameterize := f \o phi.

Local Lemma fphi_zero : reparameterize zero = x.
Proof. by rewrite /reparameterize /= ?path_zero. Qed.

Local Lemma fphi_one : reparameterize one = y.
Proof. by rewrite /reparameterize /= ?path_one. Qed.

Local Lemma fphi_cts : continuous reparameterize.
Proof. by move=> ?; apply: continuous_comp; apply: cts_fun. Qed.

HB.instance Definition _ := isContinuous.Build _ _ reparameterize fphi_cts.

HB.instance Definition _ := isPath.Build j T x y reparameterize
fphi_zero fphi_one.

End path_reparameterize.

Section mk_path.
Context {i : bpTopologicalType} {T : topologicalType}.
Context {x y : T} (f : i -> T) (ctsf : continuous f).
Context (f0 : f zero = x) (f1 : f one = y).

Definition mk_path : i -> T := let _ := (ctsf, f0, f1) in f.

HB.instance Definition _ := isContinuous.Build i T mk_path ctsf.
HB.instance Definition _ := @isPath.Build i T x y mk_path f0 f1.
End mk_path.

Definition chain_path {i j : bpTopologicalType} {T : topologicalType}
(f : i -> T) (g : j -> T) : bpwedge i j -> T :=
wedge_fun (fun b => if b return (if b then i else j) -> T then f else g).

Lemma chain_path_cts_point {i j : bpTopologicalType} {T : topologicalType}
(f : i -> T) (g : j -> T) :
continuous f ->
continuous g ->
f one = g zero ->
continuous (chain_path f g).
Proof. by move=> cf cg fgE; apply: wedge_fun_continuous => // [[]|[] []]. Qed.

Section chain_path.
Context {T : topologicalType} {i j : bpTopologicalType} (x y z: T).
Context (p : {path i from x to y}) (q : {path j from y to z}).

Local Lemma chain_path_zero : chain_path p q zero = x.
Proof.
rewrite /chain_path /= wedge_lift_funE ?path_one ?path_zero //.
by case => //= [][] //=; rewrite ?path_one ?path_zero.
Qed.

Local Lemma chain_path_one : chain_path p q one = z.
Proof.
rewrite /chain_path /= wedge_lift_funE ?path_zero ?path_one //.
by case => //= [][] //=; rewrite ?path_one ?path_zero.
Qed.

Local Lemma chain_path_cts : continuous (chain_path p q).
Proof.
apply: chain_path_cts_point; [exact: cts_fun..|].
by rewrite path_zero path_one.
Qed.

HB.instance Definition _ := @isContinuous.Build _ T (chain_path p q)
chain_path_cts.
HB.instance Definition _ := @isPath.Build _ T x z (chain_path p q)
chain_path_zero chain_path_one.

End chain_path.
31 changes: 31 additions & 0 deletions theories/homotopy_theory/wedge_sigT.v
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ From mathcomp Require Import separation_axioms function_spaces.
(* wedge_prod == the mapping from the wedge as a quotient of sums to *)
(* the wedge as a subspace of the product topology. *)
(* It's an embedding when the index is finite. *)
(* bpwedge_shared_pt b == the shared point in the bpwedge. Either zero or one *)
(* depending on `b`. *)
(* bpwedge == wedge of two bipointed spaces gluing zero to one *)
(* bpwedge_lift == wedge_lift specialized to the bipointed wedge *)
(* ``` *)
(* *)
(* The type `wedge p0` is endowed with the structures of: *)
Expand All @@ -35,6 +39,10 @@ From mathcomp Require Import separation_axioms function_spaces.
(* - quotient *)
(* - pointed *)
(* *)
(* The type `bpwedge` is endowed with the structures of: *)
(* - topology via `quotient_topology` *)
(* - quotient *)
(* - bipointed *)
(******************************************************************************)

Set Implicit Arguments.
Expand Down Expand Up @@ -379,3 +387,26 @@ HB.instance Definition _ := Quotient.on pwedge.
HB.instance Definition _ := isPointed.Build pwedge pwedge_point.

End pwedge.

Section bpwedge.
Context (X Y : bpTopologicalType).

Definition bpwedge_shared_pt b :=
if b return (if b then X else Y) then @one X else @zero Y.
Local Notation bpwedge := (@wedge bool _ bpwedge_shared_pt).
Local Notation bpwedge_lift := (@wedge_lift bool _ bpwedge_shared_pt).

Local Lemma wedge_neq : @bpwedge_lift true zero != @bpwedge_lift false one.
Proof.
by apply/eqP => /eqmodP/predU1P[//|/andP[/= + _]]; exact/negP/zero_one_neq.
Qed.

Local Lemma bpwedgeE : @bpwedge_lift true one = @bpwedge_lift false zero .
Proof. by apply/eqmodP/orP; rewrite !eqxx; right. Qed.

HB.instance Definition _ := @isBiPointed.Build
bpwedge (@bpwedge_lift true zero) (@bpwedge_lift false one) wedge_neq.
End bpwedge.

Notation bpwedge X Y := (@wedge bool _ (bpwedge_shared_pt X Y)).
Notation bpwedge_lift X Y := (@wedge_lift bool _ (bpwedge_shared_pt X Y)).
4 changes: 4 additions & 0 deletions theories/topology_theory/topology_structure.v
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,10 @@ HB.structure Definition Topological :=
HB.structure Definition PointedTopological :=
{T of PointedNbhs T & Nbhs_isTopological T}.

#[short(type="bpTopologicalType")]
HB.structure Definition BiPointedTopological :=
{ X of BiPointed X & Topological X }.

Section Topological1.
Context {T : topologicalType}.

Expand Down

0 comments on commit 71b1296

Please sign in to comment.