Built with Alectryon. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
From HoTT Require Import Basics.From HoTT Require Import Basics.Require Import Classes.interfaces.abstract_algebra Classes.theory.groups.Require Import Pointed.Core Pointed.pSusp.Require Import Homotopy.HSpace.Core.Require Import Homotopy.Suspension.Require Import Homotopy.Join.Core Homotopy.Join.JoinSusp.LocalOpen Scope pointed_scope.LocalOpen Scope mc_mult_scope.LocalOpen Scope path_scope.(** The Cayley-Dickson Construction *)(** The Cayley-Dickson construction in homotopy type theory due to Buchholtz and Rijke https://arxiv.org/abs/1610.01134 is a method to construct an H-space structure on the join of two suspensions of a type [A]. As a special case, this gives a way to construct an H-space structure on [S^3] leading to the quaternionic Hopf fibration.The construction works by replicating the classical Cayley-Dickson construction on convolution algebras ([*]-algebras), which can produce the complex numbers, quaternions, octonions, etc. starting with the real numbers. We cannot replicate this directly in HoTT since such algebras have a contractible underlying vector space, therefore the construction here attempts to axiomatize the properties of the units of those algebras instead.This is done by postulating a structure called a "Cayley-Dickson imaginaroid" on a type [A] and showing that [Join (Susp A) (Susp A)] is an H-space. An open problem is to show that this space itself is also an imaginaroid given further, yet unspecified, coherences on [A]. *)(** ** Cayley-Dickson spheroids *)(** A Cayley-Dickson Spheroid is a pointed type X which is an H-space, with two operations called negation and conjugation, satisfying the following seven laws: 1. [--x = x] 2. [x** = x] 3. [1* = 1] 4. [(-x)* = -x*] 5. [x(-y) = -(xy)] 6. [(xy)* = y* x*] 7. [x* x = 1]Note that the above laws are written in pseudocode since we cannot define multiplication by juxtaposition in Coq, and * is used to denote conjugation. *)ClassCayleyDicksonSpheroid (X : pType) := {
cds_hspace :: IsHSpace X;
cds_negate :: Negate X;
cds_conjug :: Conjugate X;
cds_negate_inv :: Involutive cds_negate;
cds_conjug_inv :: Involutive cds_conjug;
cds_conjug_unit_pres :: IsUnitPreserving cds_conjug;
cds_conjug_left_inv :: LeftInverse (.*.) cds_conjug mon_unit;
cds_conjug_distr :: DistrOpp (.*.) cds_conjug;
cds_swapop :: SwapOp (-) cds_conjug;
cds_factorneg_r :: FactorNegRight (-) (.*.)
}.SectionCayleyDicksonSpheroid_Properties.Context {X : pType} `(CayleyDicksonSpheroid X).Local Instanceisequiv_cds_conjug : IsEquiv cds_conjug
:= isequiv_involution cds_conjug cds_conjug_inv.
X: pType H: CayleyDicksonSpheroid X
FactorNegLeft negate sg_op
X: pType H: CayleyDicksonSpheroid X
FactorNegLeft negate sg_op
X: pType H: CayleyDicksonSpheroid X x, y: X
- x * y = - (x * y)
X: pType H: CayleyDicksonSpheroid X x, y: X
conj (- x * y) = conj (- (x * y))
X: pType H: CayleyDicksonSpheroid X x, y: X
conj y * conj (- x) = conj (- (x * y))
X: pType H: CayleyDicksonSpheroid X x, y: X
conj y * conj (- x) = - conj (x * y)
X: pType H: CayleyDicksonSpheroid X x, y: X
conj y * conj (- x) = - (conj y * conj x)
X: pType H: CayleyDicksonSpheroid X x, y: X
conj y * conj (- x) = conj y * - conj x
X: pType H: CayleyDicksonSpheroid X x, y: X
conj (- x) = - conj x
apply swapop.Defined.
X: pType H: CayleyDicksonSpheroid X
RightInverse sg_op cds_conjug mon_unit
X: pType H: CayleyDicksonSpheroid X
RightInverse sg_op cds_conjug mon_unit
X: pType H: CayleyDicksonSpheroid X x: X
x * cds_conjug x = mon_unit
X: pType H: CayleyDicksonSpheroid X x: X
cds_conjug (cds_conjug x) * conj x = mon_unit
rapply left_inverse.Defined.EndCayleyDicksonSpheroid_Properties.(** ** Negation and conjugation on suspensions *)Instanceconjugate_susp (A : Type) `(Negate A) : Conjugate (Susp A)
:= functor_susp (-).Instancenegate_susp (A : Type) `(Negate A) : Negate (Susp A)
:= susp_neg _ o conjugate_susp A (-).(** [conjugate_susp A] and [negate_susp A] commute. *)
A: Type H: Negate A
SwapOp (negate_susp A negate) (conjugate_susp A negate)
A: Type H: Negate A
SwapOp (negate_susp A negate) (conjugate_susp A negate)
A: Type H: Negate A x: Susp A
conj (- x) = - conj x
A: Type H: Negate A x: Susp A
- conj x = conj (- x)
napply susp_neg_natural.Defined.(** [conjugate_susp A] is involutive, since any functor applied to an involution gives an involution. *)
A: Type H: Negate A Involutive0: Involutive negate
Involutive (conjugate_susp A negate)
A: Type H: Negate A Involutive0: Involutive negate
Involutive (conjugate_susp A negate)
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
conjugate_susp A negate (conjugate_susp A negate x) = x
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
functor_susp (funx0 : A => - - x0) x = x
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
functor_susp (funx0 : A => - - x0) x = functor_susp idmap x
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
(funx0 : A => - - x0) == idmap
exact involutive.Defined.(** [negate_susp A] is involutive as any composite of commuting involutions is an involution. *)
A: Type H: Negate A Involutive0: Involutive negate
Involutive (negate_susp A negate)
A: Type H: Negate A Involutive0: Involutive negate
Involutive (negate_susp A negate)
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
negate_susp A negate (negate_susp A negate x) = x
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
susp_neg A (conjugate_susp A negate (susp_neg A (conjugate_susp A negate x))) =
x
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
conjugate_susp A negate (susp_neg A (conjugate_susp A negate x)) = ?Goal
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
susp_neg A ?Goal = x
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
susp_neg A (- conj x) = x
A: Type H: Negate A Involutive0: Involutive negate x: Susp A
conjugate_susp A negate (conj x) = x
rapply involutive.Defined.(** ** Cayley-Dickson imaginaroids *)ClassCayleyDicksonImaginaroid (A : Type) := {
cdi_negate :: Negate A;
cdi_negate_involutive :: Involutive cdi_negate;
cdi_susp_hspace :: IsHSpace (psusp A);
cdi_susp_factorneg_r :: FactorNegRight (negate_susp A cdi_negate) hspace_op;
cdi_susp_conjug_left_inv :: LeftInverse hspace_op (conjugate_susp A cdi_negate) mon_unit;
cdi_susp_conjug_distr :: DistrOpp hspace_op (conjugate_susp A cdi_negate);
}.Instanceisunitpreserving_conjugate_susp {A} `(Negate A)
: @IsUnitPreserving _ _ pt pt (conjugate_susp A _)
:= idpath.(** Every suspension of a Cayley-Dickson imaginaroid gives a Cayley-Dickson spheroid. *)Instancecds_susp_cdi {A} `(CayleyDicksonImaginaroid A)
: CayleyDicksonSpheroid (psusp A) := {}.
A: Type H: CayleyDicksonImaginaroid A
RightInverse hspace_op (conjugate_susp A cdi_negate) mon_unit
A: Type H: CayleyDicksonImaginaroid A
RightInverse hspace_op (conjugate_susp A cdi_negate) mon_unit
stapply cds_conjug_right_inv.Defined.Instancecdi_susp_left_identity {A} `(CayleyDicksonImaginaroid A)
: LeftIdentity hspace_op mon_unit
:= _.Instancecdi_susp_right_identity {A} `(CayleyDicksonImaginaroid A)
: RightIdentity hspace_op mon_unit
:= _.
A: Type H: CayleyDicksonImaginaroid A
FactorNegLeft (negate_susp A cdi_negate) hspace_op
A: Type H: CayleyDicksonImaginaroid A
FactorNegLeft (negate_susp A cdi_negate) hspace_op
stapply cds_factorneg_l.Defined.(** A Cayley-Dickson imaginaroid [A] whose multiplication on the suspension is associative gives rise to an H-space structure on the join of the suspension of [A] with itself. *)SectionImaginaroidHSpace.(** Let [A] be a Cayley-Dickson imaginaroid with associative H-space multiplication on [Susp A]. *)Context {A} `(CayleyDicksonImaginaroid A) `(!Associative hspace_op).(** Declaring these as local instances so that they can be found *)Local Instancehspace_op' : SgOp (Susp A) := hspace_op.Local Instancehspace_unit' : MonUnit (Susp A) := hspace_mon_unit.Local Definitioncd_diamond_map_l (ac : Susp A)
:= funx => a * (c * -x).Local Definitioncd_diamond_map_r (bc : Susp A)
:= funy => c * (y * b).SectionScalarBoundary.Context (abcd : Susp A).
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_l a c (- mon_unit) = a * c
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_l a c (- mon_unit) = a * c
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
c * - - mon_unit = c
exact (hspace_right_identity c).Defined.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_l a c (conj c * (conj a * d) * conj b) = - d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_l a c (conj c * (conj a * d) * conj b) = - d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
a * (c * - (conj c * (conj a * d) * conj b)) = - d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
a * - (c * (conj c * (conj a * d) * conj b)) = - d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
- (a * (c * (conj c * (conj a * d) * conj b))) = - d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
- (a * (c * (conj c * (conj a * d) * conj b))) = - (d * conj b)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
a * (c * (conj c * (conj a * d) * conj b)) = d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
a * (c * (conj c * (conj a * d)) * conj b) = d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
a * (c * (conj c * (conj a * d))) * conj b = d * conj b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
a * (c * (conj c * (conj a * d))) = d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
a * (conj a * d) = d
rapply sgop_inv_g_Vg.Defined.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_r b c mon_unit = c * b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_r b c mon_unit = c * b
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
mon_unit * b = b
apply left_identity.Defined.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_r b c (conj c * (conj a * d) * conj b) = conj a * d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
cd_diamond_map_r b c (conj c * (conj a * d) * conj b) = conj a * d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
c * (conj c * (conj a * d) * conj b * b) = conj a * d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: Susp A
c * (conj c * (conj a * d)) = conj a * d
tapply sgop_inv_g_Vg.Defined.EndScalarBoundary.(** Here is the multiplication map in algebraic form: [(a,b) * (c,d) = (a * c - d * b*, a* * d + c * b)]. The following is the spherical form. *)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
SgOp (pjoin (psusp A) (psusp A))
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
SgOp (pjoin (psusp A) (psusp A))
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallacd : psusp A, ?P_AC a c = ?P_AD a d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallbcd : psusp A, ?P_BC b c = ?P_BD b d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallcab : psusp A, ?P_AC a c = ?P_BC b c
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
foralldab : psusp A, ?P_AD a d = ?P_BD b d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallabcd : psusp A,
?P_gAx a c d @ ?P_gxD d a b = ?P_gxC c a b @ ?P_gBx b c d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
exact (funab => joinl (a * b)).
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
exact (funab => joinr (conj a * b)).
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
exact (funab => joinr (b * a)).
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
psusp A -> psusp A -> pjoin (psusp A) (psusp A)
exact (funab => joinl ((- b) * conj a)).
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallacd : psusp A,
(funa0b : psusp A => joinl (a0 * b)) a c =
(funa0b : psusp A => joinr (conj a0 * b)) a d
intros; apply jglue.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallbcd : psusp A,
(funab0 : psusp A => joinr (b0 * a)) b c =
(funab0 : psusp A => joinl (- b0 * conj a)) b d
intros; symmetry; apply jglue.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallcab : psusp A,
(funa0b0 : psusp A => joinl (a0 * b0)) a c =
(funa0b0 : psusp A => joinr (b0 * a0)) b c
intros; apply jglue.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
foralldab : psusp A,
(funa0b0 : psusp A => joinr (conj a0 * b0)) a d =
(funa0b0 : psusp A => joinl (- b0 * conj a0)) b d
intros; symmetry; apply jglue.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
forallabcd : psusp A,
(funa0c0d0 : psusp A => jglue (a0 * c0) (conj a0 * d0)) a c d @
(fund0a0b0 : psusp A => (jglue (- d0 * conj b0) (conj a0 * d0))^) d a b =
(func0a0b0 : psusp A => jglue (a0 * c0) (c0 * b0)) c a b @
(funb0c0d0 : psusp A => (jglue (- d0 * conj b0) (c0 * b0))^) b c d
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
jglue (a * c) (conj a * d) @ (jglue (- d * conj b) (conj a * d))^ =
jglue (a * c) (c * b) @ (jglue (- d * conj b) (c * b))^
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
jglue (a * c) (c * b) @ (jglue (- d * conj b) (c * b))^ =
jglue (a * c) (conj a * d) @ (jglue (- d * conj b) (conj a * d))^
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
diamond (a * c) (- d * conj b) (c * b) (conj a * d)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
diamond (cd_diamond_map_l a c (- mon_unit)) (- d * conj b)
(c * b) (conj a * d)
(** Rewrite this corner first since the other also contains [conj a * d]. *)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
diamond (cd_diamond_map_l a c (- mon_unit)) (- d * conj b)
(c * b) (cd_diamond_map_r b c (conj c * (conj a * d) * conj b))
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
diamond (cd_diamond_map_l a c (- mon_unit))
(cd_diamond_map_l a c (conj c * (conj a * d) * conj b))
(c * b) (cd_diamond_map_r b c (conj c * (conj a * d) * conj b))
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
diamond (cd_diamond_map_l a c (- mon_unit))
(cd_diamond_map_l a c (conj c * (conj a * d) * conj b))
(cd_diamond_map_r b c mon_unit)
(cd_diamond_map_r b c (conj c * (conj a * d) * conj b))
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op a, b, c, d: psusp A
diamond (- mon_unit) (conj c * (conj a * d) * conj b) mon_unit
(conj c * (conj a * d) * conj b)
apply diamond_susp.Defined.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
LeftIdentity cd_op pt
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
LeftIdentity cd_op pt
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op z: pjoin (psusp A) (psusp A)
Join_rec (funb : Susp A => joinl (pt * b))
(funb : Susp A => joinr (conj pt * b))
(funcd : Susp A => jglue (pt * c) (conj pt * d)) z =
z
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op z: pjoin (psusp A) (psusp A)
functor_join idmap idmap z = z
napply functor_join_idmap.Defined.
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
RightIdentity cd_op pt
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op
RightIdentity cd_op pt
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op z: pjoin (psusp A) (psusp A)
cd_op z pt = z
(* This one doesn't simplify to a nice term, but a similar proof works. *)
A: Type H: CayleyDicksonImaginaroid A Associative0: Associative hspace_op z: pjoin (psusp A) (psusp A)