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 Modality.LocalOpen Scope path_scope.(** * The double negation modality *)(** The operation sending [X] to [~~X] is a modality. This is Exercise 7.12 in the book. Note that it is (apparently) *not* accessible unless we assume propositional resizing. *)
H: Funext
Modality
H: Funext
Modality
H: Funext
Type -> Type
H: Funext
forallT : Type, T -> ?O_reflector T
H: Funext
forall (A : Type) (B : ?O_reflector A -> Type),
(foralla : A, ?O_reflector (B (?to A a))) ->
forallz : ?O_reflector A, ?O_reflector (B z)
H: Funext
forall (A : Type) (B : ?O_reflector A -> Type)
(f : foralla : A, ?O_reflector (B (?to A a)))
(a : A), ?O_indO A B f (?to A a) = f a
H: Funext
forall (A : Type) (zz' : ?O_reflector A),
IsEquiv (?to (z = z'))
H: Funext
Type -> Type
intros X; exact (~~X).
H: Funext
forallT : Type, T -> (funX : Type => ~~ X) T
exact @not_not_unit.
H: Funext
forall (A : Type)
(B : (funX : Type => ~~ X) A -> Type),
(foralla : A,
(funX : Type => ~~ X) (B (not_not_unit a))) ->
forallz : (funX : Type => ~~ X) A,
(funX : Type => ~~ X) (B z)
H: Funext A: Type B: ~~ A -> Type f: foralla : A, ~~ B (not_not_unit a) z: ~~ A nBz: ~ B z
Empty
H: Funext A: Type B: ~~ A -> Type f: foralla : A, ~~ B (not_not_unit a) z: ~~ A nBz: ~ B z a: A
forall (A : Type)
(B : (funX : Type => ~~ X) A -> Type)
(f : foralla : A,
(funX : Type => ~~ X) (B (not_not_unit a)))
(a : A),
((fun (A0 : Type) (B0 : ~~ A0 -> Type)
(f0 : foralla0 : A0, ~~ B0 (not_not_unit a0))
(z : ~~ A0) =>
(funnBz : ~ B0 z =>
z
((funa0 : A0 =>
f0 a0
(transport (funx : ~~ A0 => ~ B0 x)
(path_ishprop z (not_not_unit a0)) nBz))
:
~ A0))
:
~~ B0 z)
:
forall (A0 : Type)
(B0 : (funX : Type => ~~ X) A0 -> Type),
(foralla0 : A0,
(funX : Type => ~~ X) (B0 (not_not_unit a0))) ->
forallz : (funX : Type => ~~ X) A0,
(funX : Type => ~~ X) (B0 z)) A B f (not_not_unit a) =
f a
H: Funext A: Type B: ~~ A -> Type f: foralla : A, ~~ B (not_not_unit a) a: A
(funnBz : ~ B (not_not_unit a) =>
not_not_unit a
(funa0 : A =>
f a0
(transport (funx : ~~ A => ~ B x)
(path_ishprop (not_not_unit a)
(not_not_unit a0)) nBz))) = f a
apply path_ishprop.
H: Funext
forall (A : Type) (zz' : (funX : Type => ~~ X) A),
IsEquiv not_not_unit
H: Funext A: Type z, z': ~~ A
IsEquiv not_not_unit
H: Funext A: Type z, z': ~~ A
~~ (z = z') -> z = z'
intros; apply path_ishprop.Defined.(** By definition, the local types for this modality are the types such that [not_not_unit : P -> ~~P] is an equivalence. These are exactly the stable propositions, i.e. those propositions [P] such that [~~P -> P]. *)DefinitioninO_notnot `{Funext} (P : Type)
: In NotNot P <~> (Stable P * IsHProp P)
:= equiv_isequiv_not_not_unit_stable_hprop P.