Local Open Scope nat_scope. Local Open Scope path_scope. (** * Cantor space 2^N *) Definition Cantor : Type := nat -> Bool.Cantor + Cantor -> CantorCantor + Cantor -> Cantorc: Cantor
n: natBoolc: Cantor
n: natBoolc: Cantor
n: natBoolc: CantorBoolc: Cantor
n: natBoolexact true.c: CantorBoolexact (c n).c: Cantor
n: natBoolc: Cantor
n: natBoolc: CantorBoolc: Cantor
n: natBoolexact false.c: CantorBoolexact (c n). Defined.c: Cantor
n: natBoolCantor -> Cantor + CantorCantor -> Cantor + Cantorc: CantorCantor + Cantorc: CantorCantor + Cantorc: CantorCantor + Cantorexact (inl (fun n => c n.+1)).c: CantorCantor + Cantorexact (inr (fun n => c n.+1)). Defined.c: CantorCantor + CantorH: FunextIsEquiv cantor_foldH: FunextIsEquiv cantor_foldH: Funext(fun x : Cantor => cantor_fold (cantor_unfold x)) == idmapH: Funext(fun x : Cantor + Cantor => cantor_unfold (cantor_fold x)) == idmapH: Funext(fun x : Cantor => cantor_fold (cantor_unfold x)) == idmapH: Funext
c: Cantor
n: natcantor_fold (cantor_unfold c) n = c nH: Funext
c: Cantorcantor_fold (cantor_unfold c) 0 = c 0H: Funext
c: Cantor
n: nat
IH: cantor_fold (cantor_unfold c) n = c ncantor_fold (cantor_unfold c) n.+1 = c n.+1H: Funext
c: Cantorcantor_fold (cantor_unfold c) 0 = c 0case (c 0); reflexivity.H: Funext
c: Cantorcantor_fold (if c 0 then inl (fun n : nat => c n.+1) else inr (fun n : nat => c n.+1)) 0 = c 0H: Funext
c: Cantor
n: nat
IH: cantor_fold (cantor_unfold c) n = c ncantor_fold (cantor_unfold c) n.+1 = c n.+1case (c 0); reflexivity.H: Funext
c: Cantor
n: nat
IH: cantor_fold (cantor_unfold c) n = c ncantor_fold (if c 0 then inl (fun n : nat => c n.+1) else inr (fun n : nat => c n.+1)) n.+1 = c n.+1intros [c|c]; apply path_sum; reflexivity. Defined. Definition equiv_cantor_fold `{Funext} : Cantor + Cantor <~> Cantor := Build_Equiv _ _ cantor_fold _. Definition equiv_cantor_unfold `{Funext} : Cantor <~> Cantor + Cantor := Build_Equiv _ _ cantor_unfold (isequiv_inverse equiv_cantor_fold).H: Funext(fun x : Cantor + Cantor => cantor_unfold (cantor_fold x)) == idmap