Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. 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.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Idempotents.Require Import HoTT.Truncations.Core Universes.BAut Spaces.Cantor.LocalOpen Scope equiv_scope.LocalOpen Scope path_scope.(** * BAut(Cantor) *)(** ** A pre-idempotent on [BAut Cantor] that does not split *)(** We go into a non-exported module so that we can use short names for definitions without polluting the global namespace. *)ModuleBAut_Cantor_Idempotent.SectionAssumptions.Context `{Univalence}.
H: Univalence
BAut Cantor -> BAut Cantor
H: Univalence
BAut Cantor -> BAut Cantor
H: Univalence Z: BAut Cantor
BAut Cantor
(** Here is the important part of this definition. *)
H: Univalence Z: BAut Cantor
merely (Z + Cantor = Cantor)
(** The rest is just a proof that [Z+Cantor] is again equivalent to [Cantor], using [cantor_fold] and the assumption that [Z] is equivalent to [Cantor]. *)
exact (equiv_path _ _ e +E 1).Defined.(** For the pre-idempotence of [f], the main point is again the existence of the equivalence [fold_cantor]. *)
H: Univalence
IsPreIdempotent f
H: Univalence
IsPreIdempotent f
H: Univalence Z: BAut Cantor
f (f Z) = f Z
H: Univalence Z: BAut Cantor
f (f Z) <~> f Z
H: Univalence Z: BAut Cantor
Z + Cantor + Cantor <~> Z + Cantor
H: Univalence Z: BAut Cantor
Z + (Cantor + Cantor) <~> Z + Cantor
exact (1 +E equiv_cantor_fold).Defined.(** We record how the action of [f] and [f o f] on paths corresponds to an action on equivalences. *)
H: Univalence Z, Z': BAut Cantor p: Z = Z'
equiv_path (f Z).1 (f Z').1 (ap f p) ..1 =
equiv_path Z Z' p ..1 +E 1
H: Univalence Z, Z': BAut Cantor p: Z = Z'
equiv_path (f Z).1 (f Z').1 (ap f p) ..1 =
equiv_path Z Z' p ..1 +E 1
H: Univalence Z: BAut Cantor
equiv_path (f Z).1 (f Z).1 (ap f 1) ..1 =
equiv_path Z Z 1 ..1 +E 1
H: Univalence Z: BAut Cantor
equiv_path (f Z).1 (f Z).1 (ap f 1) ..1 ==
equiv_path Z Z 1 ..1 +E 1
intros [z|a]; reflexivity.Defined.
H: Univalence Z, Z': BAut Cantor p: Z = Z'
equiv_path (f (f Z)).1 (f (f Z')).1 (ap (f o f) p) ..1 =
equiv_path Z Z' p ..1 +E 1 +E 1
H: Univalence Z, Z': BAut Cantor p: Z = Z'
equiv_path (f (f Z)).1 (f (f Z')).1 (ap (f o f) p) ..1 =
equiv_path Z Z' p ..1 +E 1 +E 1
H: Univalence Z: BAut Cantor
equiv_path (f (f Z)).1 (f (f Z)).1
(ap (funx : BAut Cantor => f (f x)) 1) ..1 =
equiv_path Z Z 1 ..1 +E 1 +E 1
H: Univalence Z: BAut Cantor
equiv_path (f (f Z)).1 (f (f Z)).1
(ap (funx : BAut Cantor => f (f x)) 1) ..1 ==
equiv_path Z Z 1 ..1 +E 1 +E 1
intros [[z|a]|a]; reflexivity.Defined.(** Now let's assume [f] is quasi-idempotent, but not necessarily using the same witness of pre-idempotency. *)Context (Ip : IsPreIdempotent f) (Jp : @IsQuasiIdempotent _ f Ip).DefinitionI (Z : BAut Cantor)
: (Z + Cantor) + Cantor <~> Z + Cantor
:= equiv_path _ _ (Ip Z)..1.DefinitionI0
: Cantor + Cantor + Cantor + Cantor <~> Cantor + Cantor + Cantor
:= I (f (point (BAut Cantor))).(** We don't know much about [I0], but we can show that it maps the rightmost two summands to the rightmost one, using the naturality of [I]. Here is the naturality. *)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor e: Z <~> Z'
I Z' oE (e +E 1 +E 1) = (e +E 1) oE I Z
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor e: Z <~> Z'
I Z' oE (e +E 1 +E 1) = (e +E 1) oE I Z
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor q: Z = Z'
I Z' oE (equiv_path Z Z' q +E 1 +E 1) =
(equiv_path Z Z' q +E 1) oE I Z
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
I Z'
oE (equiv_path Z Z'
((equiv_path_sigma_hprop Z Z')^-1 p) +E 1 +E 1) =
(equiv_path Z Z' ((equiv_path_sigma_hprop Z Z')^-1 p) +E
1) oE I Z
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
I Z' oE (equiv_path Z Z' p ..1 +E 1 +E 1) =
(equiv_path Z Z' p ..1 +E 1) oE I Z
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
I Z'
oE equiv_path (f (f Z)).1 (f (f Z')).1
(ap (funx : BAut Cantor => f (f x)) p) ..1 =
equiv_path (f Z).1 (f Z').1 (ap f p) ..1 oE I Z
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
equiv_path (f (f Z')).1 (f Z').1 (Ip Z') ..1
oE equiv_path (f (f Z)).1 (f (f Z')).1
(ap (funx : BAut Cantor => f (f x)) p) ..1 =
equiv_path (f Z).1 (f Z').1 (ap f p) ..1
oE equiv_path (f (f Z)).1 (f Z).1 (Ip Z) ..1
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
equiv_path (Z + Cantor + Cantor) (Z' + Cantor)
((ap (funx : BAut Cantor => f (f x)) p) ..1 @
(Ip Z') ..1) =
equiv_path (Z + Cantor + Cantor) (Z' + Cantor)
((Ip Z) ..1 @ (ap f p) ..1)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
(ap (funx : BAut Cantor => f (f x)) p) ..1 @
(Ip Z') ..1 = (Ip Z) ..1 @ (ap f p) ..1
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
(ap (funx : BAut Cantor => f (f x)) p @ Ip Z') ..1 =
(Ip Z @ ap f p) ..1
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z, Z': BAut Cantor p: Z = Z'
ap (funx : BAut Cantor => f (f x)) p @ Ip Z' =
Ip Z @ ap f p
apply (concat_Ap Ip).Qed.(** To show our claim about the action of [I0], we will apply this naturality to the flip automorphism of [Cantor + Cantor]. Here are the images of that automorphism under [f] and [f o f]. *)Definitionf_flip :=
equiv_sum_symm Cantor Cantor +E equiv_idmap Cantor.Definitionff_flip :=
(equiv_sum_symm Cantor Cantor +E equiv_idmap Cantor) +E (equiv_idmap Cantor).(** The naturality of [I] implies that [I0] commutes with these images of the flip. *)DefinitionI0nat_flip
(x : ((Cantor + Cantor) + Cantor) + Cantor)
: I0 (ff_flip x) = f_flip (I0 x)
:= ap10_equiv
(Inat (f (point (BAut Cantor))) (f (point (BAut Cantor)))
(equiv_sum_symm Cantor Cantor))
x.(** The value of this is that we can detect which summand an element is in depending on whether or not it is fixed by [f_flip] or [ff_flip]. *)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor
f_flip x = x <-> is_inr x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor
f_flip x = x <-> is_inr x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inl (inr c) = inl (inl c)
is_inr (inl (inl c))
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inl (inl c) = inl (inr c)
is_inr (inl (inr c))
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inr c = inr c
is_inr (inr c)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Empty
f_flip (inl (inl c)) = inl (inl c)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Empty
f_flip (inl (inr c)) = inl (inr c)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Unit
f_flip (inr c) = inr c
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inl (inr c) = inl (inl c)
is_inr (inl (inl c))
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inr c = inl c
is_inr (inl (inl c))
elim (inl_ne_inr _ _ p^).
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inl (inl c) = inl (inr c)
is_inr (inl (inr c))
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inl c = inr c
is_inr (inl (inr c))
elim (inl_ne_inr _ _ p).
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inr c = inr c
is_inr (inr c)
exact tt.
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Empty
f_flip (inl (inl c)) = inl (inl c)
elim p.
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Empty
f_flip (inl (inr c)) = inl (inr c)
elim p.
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Unit
f_flip (inr c) = inr c
reflexivity.Defined.
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
ff_flip x = x <-> is_inr x + is_inl_and is_inr x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
ff_flip x = x <-> is_inr x + is_inl_and is_inr x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inl (inl (inr c)) = inl (inl (inl c))
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: inr c = inr c
is_inr (inr c) + is_inl_and is_inr (inr c)
exact (inl tt).
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Empty + Empty
ff_flip (inl (inl (inl c))) = inl (inl (inl c))
destruct p as [e|e]; elim e.
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Empty + Empty
ff_flip (inl (inl (inr c))) = inl (inl (inr c))
destruct p as [e|e]; elim e.
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Empty + Unit
ff_flip (inl (inr c)) = inl (inr c)
destruct p as [e|_]; [ elim e | reflexivity ].
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f c: Cantor p: Unit + Empty
ff_flip (inr c) = inr c
destruct p as [_|e]; [ reflexivity | elim e ].Defined.(** And the naturality guarantees that [I0] preserves fixed points. *)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
ff_flip x = x <-> f_flip (I0 x) = I0 x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
ff_flip x = x <-> f_flip (I0 x) = I0 x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor p: ff_flip x = x
f_flip (I0 x) = I0 x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor p: f_flip (I0 x) = I0 x
ff_flip x = x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor p: ff_flip x = x
f_flip (I0 x) = I0 x
exact ((I0nat_flip x)^ @ ap I0 p).
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor p: f_flip (I0 x) = I0 x
ff_flip x = x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor p: f_flip (I0 x) = I0 x
I0 (ff_flip x) = I0 x
exact (I0nat_flip x @ p).Defined.(** Putting it all together, here is the proof of our claim about [I0]. *)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
is_inr x + is_inl_and is_inr x <-> is_inr (I0 x)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
is_inr x + is_inl_and is_inr x <-> is_inr (I0 x)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
is_inr x + is_inl_and is_inr x <->
f_flip (I0 x) = I0 x
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x: Cantor + Cantor + Cantor + Cantor
is_inr x + is_inl_and is_inr x <-> ff_flip x = x
apply iff_inverse, ff_flip_fixed_iff_inr.Defined.(** Now we bring quasi-idempotence into play. *)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z: BAut Cantor
I Z +E 1 = I (f Z)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z: BAut Cantor
I Z +E 1 = I (f Z)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z: BAut Cantor
equiv_path (Z + Cantor + Cantor) (Z + Cantor)
(Ip Z) ..1 +E 1 =
equiv_path (Z + Cantor + Cantor + Cantor)
(Z + Cantor + Cantor) (Ip (f Z)) ..1
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z: BAut Cantor
equiv_path (f (f (f Z))).1 (f (f Z)).1
(ap f (Ip Z)) ..1 =
equiv_path (Z + Cantor + Cantor + Cantor)
(Z + Cantor + Cantor) (Ip (f Z)) ..1
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f Z: BAut Cantor
ap f (Ip Z) = Ip (f Z)
apply Jp.Defined.(** We reach a contradiction by showing that the two maps which [J] claims are equal send elements of the third summand of the domain into different summands of the codomain. *)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f
Empty
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f
Empty
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x:= inl (inr (fun_ : nat => true))
:
f (point (BAut Cantor)) + Cantor + Cantor: f (point (BAut Cantor)) + Cantor + Cantor
Empty
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x:= inl (inr (fun_ : nat => true))
:
f (point (BAut Cantor)) + Cantor + Cantor: f (point (BAut Cantor)) + Cantor + Cantor
is_inl (I (f (point (BAut Cantor))) x)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x:= inl (inr (fun_ : nat => true))
:
f (point (BAut Cantor)) + Cantor + Cantor: f (point (BAut Cantor)) + Cantor + Cantor
is_inr (I (f (point (BAut Cantor))) x)
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x:= inl (inr (fun_ : nat => true))
:
f (point (BAut Cantor)) + Cantor + Cantor: f (point (BAut Cantor)) + Cantor + Cantor
H: Univalence Ip: IsPreIdempotent f Jp: IsQuasiIdempotent f x:= inl (inr (fun_ : nat => true))
:
f (point (BAut Cantor)) + Cantor + Cantor: f (point (BAut Cantor)) + Cantor + Cantor
is_inr (I (f (point (BAut Cantor))) x)
exact (fst (I0_preserves_inr x) (inr tt)).Defined.EndAssumptions.EndBAut_Cantor_Idempotent.(** Let's make the important conclusions available globally. *)Definitionbaut_cantor_idem `{Univalence}
: BAut Cantor -> BAut Cantor
:= BAut_Cantor_Idempotent.f.Definitionpreidem_baut_cantor_idem `{Univalence}
: IsPreIdempotent baut_cantor_idem
:= BAut_Cantor_Idempotent.preidem_f.Definitionnot_qidem_baut_cantor_idem `{Univalence}
: ~ { I : IsPreIdempotent baut_cantor_idem
& IsQuasiIdempotent baut_cantor_idem }
:= funIJ => BAut_Cantor_Idempotent.impossible IJ.1 IJ.2.