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.
Require Import Basics.Overture Basics.Tactics Basics.PathGroupoids.Require Import Basics.Overture Basics.Tactics Basics.PathGroupoids.

Local Open Scope path_scope.

(** * Theorems about the 2-sphere [S^2]. *)

(* ** Definition of the 2-sphere. *)

Module Export TwoSphere.

  Private Inductive TwoSphere : Type0 :=
    | base : TwoSphere.

  Axiom surf : idpath base = idpath base.

  Definition TwoSphere_ind (P : TwoSphere -> Type)
    (b : P base) (s : idpath b = transport2 P surf b)
    : forall (x : TwoSphere), P x
    := fun x => match x with base => fun _ => b end s.

  Axiom TwoSphere_ind_beta_surf : forall (P : TwoSphere -> Type)
    (b : P base) (s : idpath b = transport2 P surf b),
    apD02 (TwoSphere_ind P b s) surf = s @ (concat_p1 _)^.

End TwoSphere.

(* ** The non-dependent eliminator *)

Definition TwoSphere_rec (P : Type) (b : P) (s : idpath b = idpath b)
  : TwoSphere -> P
  := TwoSphere_ind (fun _ => P) b (s @ (transport2_const surf b) @ (concat_p1 _)).

P: Type
b: P
s: 1 = 1

ap02 (TwoSphere_rec P b s) surf = s
P: Type
b: P
s: 1 = 1

ap02 (TwoSphere_rec P b s) surf = s
P: Type
b: P
s: 1 = 1

transport2_const surf b @@ ap02 (TwoSphere_rec P b s) surf = transport2_const surf b @@ s
P: Type
b: P
s: 1 = 1

apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ ap02 (TwoSphere_rec P b s) surf) = apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ s)
P: Type
b: P
s: 1 = 1

(apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ ap02 (TwoSphere_rec P b s) surf)) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) (transport_const 1 b) (ap (TwoSphere_rec P b s) 1))^ = (apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ s)) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) (transport_const 1 b) (ap (TwoSphere_rec P b s) 1))^
P: Type
b: P
s: 1 = 1

((apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ ap02 (TwoSphere_rec P b s) surf)) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) (transport_const 1 b) (ap (TwoSphere_rec P b s) 1))^) @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b) (apD_const (fun _ : TwoSphere => b) 1)^ = ((apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ s)) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) (transport_const 1 b) (ap (TwoSphere_rec P b s) 1))^) @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b) (apD_const (fun _ : TwoSphere => b) 1)^
P: Type
b: P
s: 1 = 1

apD02 (TwoSphere_rec P b s) surf = ((apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ s)) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) (transport_const 1 b) (ap (TwoSphere_rec P b s) 1))^) @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b) (apD_const (fun _ : TwoSphere => b) 1)^
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = ((apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ s)) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) (transport_const 1 b) (ap (TwoSphere_rec P b s) 1))^) @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b) (apD_const (fun _ : TwoSphere => b) 1)^
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = ((apD_const (TwoSphere_rec P b s) 1 @ (transport2_const surf b @@ s)) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) (transport_const 1 b) (ap (TwoSphere_rec P b s) 1))^) @ (concat_p_pp (transport2 (fun _ : TwoSphere => P) surf b) 1 (apD (TwoSphere_ind (fun _ : TwoSphere => P) b ((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))) 1) @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) (apD (TwoSphere_ind (fun _ : TwoSphere => P) b ((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))) 1))
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = ((1 @ (transport2_const surf b @@ s)) @ match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end^) @ (match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1)
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = ((transport2_const surf b @@ s) @ match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end^) @ (match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1)
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = (transport2_const surf b @@ s) @ (match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end^ @ (match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1))
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = (transport2_const surf b @@ s) @ ((match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end^ @ match transport2 (fun _ : TwoSphere => P) surf b as p in (_ = a) return (p @ 1 = (p @ 1) @ 1) with | 1 => 1 end) @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1)
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = (transport2_const surf b @@ s) @ (1 @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1)
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = (transport2_const surf b @@ s) @ ((concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1))^) @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1)
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = (transport2_const surf b @@ s) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1) @ ((concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1))^ @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1))
P: Type
b: P
s: 1 = 1

((s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) @ (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))^ = ((transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)) @ ((concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1))^ @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1)
P: Type
b: P
s: 1 = 1

(s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b) = (((transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)) @ ((concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1))^ @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1)) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)
P: Type
b: P
s: 1 = 1

(s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b) = ((transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)) @ (((concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1))^ @ whiskerR (concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)) 1) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b))
P: Type
b: P
s: 1 = 1

(s @ transport2_const surf b) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b) = ((transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b)
P: Type
b: P
s: 1 = 1

s @ transport2_const surf b = (transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)
P: Type
b: P
s: 1 = 1

whiskerL 1 s @ transport2_const surf b = (transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)
P: Type
b: P
s: 1 = 1

whiskerL 1 s @ (((concat_p1 (1 @ 1))^ @ whiskerR (transport2_const surf b) 1) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)) = (transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)
P: Type
b: P
s: 1 = 1

whiskerL 1 s @ ((1 @ whiskerR (transport2_const surf b) 1) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)) = (transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)
P: Type
b: P
s: 1 = 1

(whiskerL 1 s @ (1 @ whiskerR (transport2_const surf b) 1)) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1) = (transport2_const surf b @@ s) @ concat_p1 (transport2 (fun _ : TwoSphere => P) surf b @ 1)
P: Type
b: P
s: 1 = 1

whiskerL 1 s @ (1 @ whiskerR (transport2_const surf b) 1) = transport2_const surf b @@ s
P: Type
b: P
s: 1 = 1

whiskerL 1 s @ whiskerR (transport2_const surf b) 1 = transport2_const surf b @@ s
P: Type
b: P
s: 1 = 1

whiskerR (transport2_const surf b) 1 @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b @ transport_const 1 b) s = transport2_const surf b @@ s
P: Type
b: P
s: 1 = 1

transport2_const surf b @@ s = whiskerR (transport2_const surf b) 1 @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b @ transport_const 1 b) s
P: Type
b: P
s: 1 = 1

(transport2_const surf b @ 1) @@ s = whiskerR (transport2_const surf b) 1 @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b @ transport_const 1 b) s
P: Type
b: P
s: 1 = 1

(transport2_const surf (transport (fun _ : TwoSphere => P) 1 b) @ 1) @@ (1 @ s) = whiskerR (transport2_const surf b) 1 @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b @ transport_const 1 b) s
P: Type
b: P
s: 1 = 1

(transport2_const surf (transport (fun _ : TwoSphere => P) 1 b) @@ 1) @ (1 @@ s) = whiskerR (transport2_const surf b) 1 @ whiskerL (transport2 (fun _ : TwoSphere => P) surf b @ transport_const 1 b) s
f_ap. Defined.