Double negation stable embeddings

Content created by Fredrik Bakke.

Created on 2025-01-07.
Last modified on 2025-01-07.

module logic.double-negation-stable-embeddings where
Imports
open import foundation.action-on-identifications-functions
open import foundation.cartesian-morphisms-arrows
open import foundation.decidable-embeddings
open import foundation.decidable-maps
open import foundation.decidable-propositions
open import foundation.decidable-types
open import foundation.dependent-pair-types
open import foundation.double-negation-stable-propositions
open import foundation.embeddings
open import foundation.fibers-of-maps
open import foundation.functoriality-cartesian-product-types
open import foundation.functoriality-coproduct-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopy-induction
open import foundation.identity-types
open import foundation.logical-equivalences
open import foundation.negation
open import foundation.propositional-maps
open import foundation.propositions
open import foundation.retracts-of-maps
open import foundation.subtype-identity-principle
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.unit-type
open import foundation.universal-property-equivalences
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.coproduct-types
open import foundation-core.empty-types
open import foundation-core.equivalences
open import foundation-core.function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.homotopies
open import foundation-core.injective-maps
open import foundation-core.torsorial-type-families

open import logic.double-negation-eliminating-maps
open import logic.double-negation-elimination

Idea

A map is said to be a double negation stable embedding if it is an embedding and its fibers satisfy double negation elimination.

Equivalently, a double negation stable embedding is a map whose fibers are double negation stable propositions. We refer to this condition as being a double negation stable propositional map.

Definitions

The condition on a map of being a double negation stable embedding

is-double-negation-stable-emb :
  {l1 l2 : Level} {X : UU l1} {Y : UU l2}  (X  Y)  UU (l1  l2)
is-double-negation-stable-emb f =
  is-emb f × is-double-negation-eliminating-map f

module _
  {l1 l2 : Level} {X : UU l1} {Y : UU l2} {f : X  Y}
  (F : is-double-negation-stable-emb f)
  where

  is-emb-is-double-negation-stable-emb : is-emb f
  is-emb-is-double-negation-stable-emb = pr1 F

  is-double-negation-eliminating-map-is-double-negation-stable-emb :
    is-double-negation-eliminating-map f
  is-double-negation-eliminating-map-is-double-negation-stable-emb = pr2 F

  is-prop-map-is-double-negation-stable-emb : is-prop-map f
  is-prop-map-is-double-negation-stable-emb =
    is-prop-map-is-emb is-emb-is-double-negation-stable-emb

  is-injective-is-double-negation-stable-emb : is-injective f
  is-injective-is-double-negation-stable-emb =
    is-injective-is-emb is-emb-is-double-negation-stable-emb

Double negation stable propositional maps

module _
  {l1 l2 : Level} {X : UU l1} {Y : UU l2}
  where

  is-double-negation-stable-prop-map : (X  Y)  UU (l1  l2)
  is-double-negation-stable-prop-map f =
    (y : Y)  is-double-negation-stable-prop (fiber f y)

  is-prop-is-double-negation-stable-prop-map :
    (f : X  Y)  is-prop (is-double-negation-stable-prop-map f)
  is-prop-is-double-negation-stable-prop-map f =
    is-prop-Π  y  is-prop-is-double-negation-stable-prop (fiber f y))

  is-double-negation-stable-prop-map-Prop : (X  Y)  Prop (l1  l2)
  is-double-negation-stable-prop-map-Prop f =
    ( is-double-negation-stable-prop-map f ,
      is-prop-is-double-negation-stable-prop-map f)

  is-prop-map-is-double-negation-stable-prop-map :
    {f : X  Y}  is-double-negation-stable-prop-map f  is-prop-map f
  is-prop-map-is-double-negation-stable-prop-map H y = pr1 (H y)

  is-double-negation-eliminating-map-is-double-negation-stable-prop-map :
    {f : X  Y} 
    is-double-negation-stable-prop-map f 
    is-double-negation-eliminating-map f
  is-double-negation-eliminating-map-is-double-negation-stable-prop-map H y =
    pr2 (H y)

The type of double negation stable embeddings

infix 5 _↪¬¬_
_↪¬¬_ :
  {l1 l2 : Level} (X : UU l1) (Y : UU l2)  UU (l1  l2)
X ↪¬¬ Y = Σ (X  Y) is-double-negation-stable-emb

double-negation-stable-emb :
  {l1 l2 : Level} (X : UU l1) (Y : UU l2)  UU (l1  l2)
double-negation-stable-emb = _↪¬¬_

module _
  {l1 l2 : Level} {X : UU l1} {Y : UU l2} (e : X ↪¬¬ Y)
  where

  map-double-negation-stable-emb : X  Y
  map-double-negation-stable-emb = pr1 e

  is-double-negation-stable-emb-map-double-negation-stable-emb :
    is-double-negation-stable-emb map-double-negation-stable-emb
  is-double-negation-stable-emb-map-double-negation-stable-emb = pr2 e

  is-emb-map-double-negation-stable-emb :
    is-emb map-double-negation-stable-emb
  is-emb-map-double-negation-stable-emb =
    is-emb-is-double-negation-stable-emb
      is-double-negation-stable-emb-map-double-negation-stable-emb

  is-double-negation-eliminating-map-map-double-negation-stable-emb :
    is-double-negation-eliminating-map map-double-negation-stable-emb
  is-double-negation-eliminating-map-map-double-negation-stable-emb =
    is-double-negation-eliminating-map-is-double-negation-stable-emb
      is-double-negation-stable-emb-map-double-negation-stable-emb

  emb-double-negation-stable-emb : X  Y
  emb-double-negation-stable-emb =
    map-double-negation-stable-emb , is-emb-map-double-negation-stable-emb

Properties

Any map of which the fibers are double negation stable propositions is a double negation stable embedding

module _
  {l1 l2 : Level} {X : UU l1} {Y : UU l2} {f : X  Y}
  where

  abstract
    is-double-negation-stable-emb-is-double-negation-stable-prop-map :
      is-double-negation-stable-prop-map f  is-double-negation-stable-emb f
    pr1 (is-double-negation-stable-emb-is-double-negation-stable-prop-map H) =
      is-emb-is-prop-map (is-prop-map-is-double-negation-stable-prop-map H)
    pr2 (is-double-negation-stable-emb-is-double-negation-stable-prop-map H) =
      is-double-negation-eliminating-map-is-double-negation-stable-prop-map H

  abstract
    is-double-negation-stable-prop-map-is-double-negation-stable-emb :
      is-double-negation-stable-emb f  is-double-negation-stable-prop-map f
    pr1 (is-double-negation-stable-prop-map-is-double-negation-stable-emb H y) =
      is-prop-map-is-double-negation-stable-emb H y
    pr2 (is-double-negation-stable-prop-map-is-double-negation-stable-emb H y) =
      is-double-negation-eliminating-map-is-double-negation-stable-emb H y

The first projection map of a dependent sum of double negation stable propositions is a double negation stable embedding

module _
  {l1 l2 : Level} {A : UU l1} (Q : A  Double-Negation-Stable-Prop l2)
  where

  is-double-negation-stable-prop-map-pr1 :
    is-double-negation-stable-prop-map
      ( pr1 {B = type-Double-Negation-Stable-Prop  Q})
  is-double-negation-stable-prop-map-pr1 y =
    is-double-negation-stable-prop-equiv
      ( equiv-fiber-pr1 (type-Double-Negation-Stable-Prop  Q) y)
      ( is-double-negation-stable-prop-type-Double-Negation-Stable-Prop (Q y))

  is-double-negation-stable-emb-pr1 :
    is-double-negation-stable-emb
      ( pr1 {B = type-Double-Negation-Stable-Prop  Q})
  is-double-negation-stable-emb-pr1 =
    is-double-negation-stable-emb-is-double-negation-stable-prop-map
      ( is-double-negation-stable-prop-map-pr1)

Decidable embeddings are double negation stable

is-double-negation-eliminating-map-is-decidable-emb :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  B} 
  is-decidable-emb f  is-double-negation-eliminating-map f
is-double-negation-eliminating-map-is-decidable-emb H =
  is-double-negation-eliminating-map-is-decidable-map
    ( is-decidable-map-is-decidable-emb H)

abstract
  is-double-negation-stable-emb-is-decidable-emb :
    {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  B} 
    is-decidable-emb f  is-double-negation-stable-emb f
  is-double-negation-stable-emb-is-decidable-emb H =
    ( is-emb-is-decidable-emb H ,
      is-double-negation-eliminating-map-is-decidable-emb H)

Equivalences are double negation stable embeddings

abstract
  is-double-negation-stable-emb-is-equiv :
    {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  B} 
    is-equiv f  is-double-negation-stable-emb f
  is-double-negation-stable-emb-is-equiv H =
    ( is-emb-is-equiv H , is-double-negation-eliminating-map-is-equiv H)

Identity maps are double negation stable embeddings

is-double-negation-stable-emb-id :
  {l : Level} {A : UU l}  is-double-negation-stable-emb (id {A = A})
is-double-negation-stable-emb-id =
  ( is-emb-id , is-double-negation-eliminating-map-id)

double-negation-stable-emb-id : {l : Level} {A : UU l}  A ↪¬¬ A
double-negation-stable-emb-id = (id , is-double-negation-stable-emb-id)

is-double-negation-stable-prop-map-id :
  {l : Level} {A : UU l}  is-double-negation-stable-prop-map (id {A = A})
is-double-negation-stable-prop-map-id y =
  is-double-negation-stable-prop-is-contr (is-torsorial-Id' y)

Being a double negation stable embedding is a property

abstract
  is-prop-is-double-negation-stable-emb :
    {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A  B) 
    is-prop (is-double-negation-stable-emb f)
  is-prop-is-double-negation-stable-emb f =
    is-prop-has-element
      ( λ H 
        is-prop-product
          ( is-property-is-emb f)
          ( is-prop-Π
            ( is-prop-has-double-negation-elim  is-prop-map-is-emb (pr1 H))))

Double negation stable embeddings are closed under homotopies

abstract
  is-double-negation-stable-emb-htpy :
    {l1 l2 : Level} {A : UU l1} {B : UU l2} {f g : A  B} 
    f ~ g  is-double-negation-stable-emb g  is-double-negation-stable-emb f
  is-double-negation-stable-emb-htpy {f = f} {g} H K =
    ( is-emb-htpy H (is-emb-is-double-negation-stable-emb K) ,
      is-double-negation-eliminating-map-htpy H
        ( is-double-negation-eliminating-map-is-double-negation-stable-emb K))

Double negation stable embeddings are closed under composition

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
  {g : B  C} {f : A  B}
  where

  is-double-negation-eliminating-map-comp-is-double-negation-stable-emb :
    is-double-negation-stable-emb g 
    is-double-negation-eliminating-map f 
    is-double-negation-eliminating-map (g  f)
  is-double-negation-eliminating-map-comp-is-double-negation-stable-emb G F =
    is-double-negation-eliminating-map-comp
      ( is-injective-is-double-negation-stable-emb G)
      ( is-double-negation-eliminating-map-is-double-negation-stable-emb G)
      ( F)

  is-double-negation-stable-prop-map-comp :
    is-double-negation-stable-prop-map g 
    is-double-negation-stable-prop-map f 
    is-double-negation-stable-prop-map (g  f)
  is-double-negation-stable-prop-map-comp K H z =
    is-double-negation-stable-prop-equiv
      ( compute-fiber-comp g f z)
      ( is-double-negation-stable-prop-Σ (K z) (H  pr1))

  is-double-negation-stable-emb-comp :
    is-double-negation-stable-emb g 
    is-double-negation-stable-emb f 
    is-double-negation-stable-emb (g  f)
  is-double-negation-stable-emb-comp K H =
    is-double-negation-stable-emb-is-double-negation-stable-prop-map
      ( is-double-negation-stable-prop-map-comp
        ( is-double-negation-stable-prop-map-is-double-negation-stable-emb K)
        ( is-double-negation-stable-prop-map-is-double-negation-stable-emb H))

comp-double-negation-stable-emb :
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} 
  B ↪¬¬ C  A ↪¬¬ B  A ↪¬¬ C
comp-double-negation-stable-emb (g , G) (f , F) =
  ( g  f , is-double-negation-stable-emb-comp G F)

infixr 15 _∘¬¬_
_∘¬¬_ :
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} 
  B ↪¬¬ C  A ↪¬¬ B  A ↪¬¬ C
_∘¬¬_ = comp-double-negation-stable-emb

Left cancellation for double negation stable embeddings

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} {f : A  B} {g : B  C}
  where

  is-double-negation-stable-emb-right-factor' :
      is-double-negation-stable-emb (g  f) 
      is-emb g 
      is-double-negation-stable-emb f
  is-double-negation-stable-emb-right-factor' GH G =
    ( is-emb-right-factor g f G (is-emb-is-double-negation-stable-emb GH) ,
      is-double-negation-eliminating-map-right-factor'
        ( is-double-negation-eliminating-map-is-double-negation-stable-emb GH)
        ( is-injective-is-emb G))

  is-double-negation-stable-emb-right-factor :
      is-double-negation-stable-emb (g  f) 
      is-double-negation-stable-emb g 
      is-double-negation-stable-emb f
  is-double-negation-stable-emb-right-factor GH G =
    is-double-negation-stable-emb-right-factor'
      ( GH)
      ( is-emb-is-double-negation-stable-emb G)

In a commuting triangle of maps, if the top and right maps are double negation stable embeddings so is the left map

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
  {top : A  B} {left : A  C} {right : B  C}
  (H : left ~ right  top)
  where

  is-double-negation-stable-emb-left-map-triangle :
    is-double-negation-stable-emb top 
    is-double-negation-stable-emb right 
    is-double-negation-stable-emb left
  is-double-negation-stable-emb-left-map-triangle T R =
    is-double-negation-stable-emb-htpy H
      ( is-double-negation-stable-emb-comp R T)

In a commuting triangle of maps, if the left and right maps are double negation stable embeddings so is the top map

In fact, the right map need only be an embedding.

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
  {top : A  B} {left : A  C} {right : B  C}
  (H : left ~ right  top)
  where

  is-double-negation-stable-emb-top-map-triangle' :
    is-emb right 
    is-double-negation-stable-emb left 
    is-double-negation-stable-emb top
  is-double-negation-stable-emb-top-map-triangle' R' L =
    is-double-negation-stable-emb-right-factor'
      ( is-double-negation-stable-emb-htpy (inv-htpy H) L)
      ( R')

  is-double-negation-stable-emb-top-map-triangle :
    is-double-negation-stable-emb right 
    is-double-negation-stable-emb left 
    is-double-negation-stable-emb top
  is-double-negation-stable-emb-top-map-triangle R L =
    is-double-negation-stable-emb-right-factor
      ( is-double-negation-stable-emb-htpy (inv-htpy H) L)
      ( R)

Characterizing equality in the type of double negation stable embeddings

htpy-double-negation-stable-emb :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (f g : A ↪¬¬ B)  UU (l1  l2)
htpy-double-negation-stable-emb f g =
  map-double-negation-stable-emb f ~ map-double-negation-stable-emb g

refl-htpy-double-negation-stable-emb :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A ↪¬¬ B) 
  htpy-double-negation-stable-emb f f
refl-htpy-double-negation-stable-emb f = refl-htpy

htpy-eq-double-negation-stable-emb :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (f g : A ↪¬¬ B) 
  f  g  htpy-double-negation-stable-emb f g
htpy-eq-double-negation-stable-emb f .f refl =
  refl-htpy-double-negation-stable-emb f

abstract
  is-torsorial-htpy-double-negation-stable-emb :
    {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A ↪¬¬ B) 
    is-torsorial (htpy-double-negation-stable-emb f)
  is-torsorial-htpy-double-negation-stable-emb f =
    is-torsorial-Eq-subtype
      ( is-torsorial-htpy (map-double-negation-stable-emb f))
      ( is-prop-is-double-negation-stable-emb)
      ( map-double-negation-stable-emb f)
      ( refl-htpy)
      ( is-double-negation-stable-emb-map-double-negation-stable-emb f)

abstract
  is-equiv-htpy-eq-double-negation-stable-emb :
    {l1 l2 : Level} {A : UU l1} {B : UU l2} (f g : A ↪¬¬ B) 
    is-equiv (htpy-eq-double-negation-stable-emb f g)
  is-equiv-htpy-eq-double-negation-stable-emb f =
    fundamental-theorem-id
      ( is-torsorial-htpy-double-negation-stable-emb f)
      ( htpy-eq-double-negation-stable-emb f)

eq-htpy-double-negation-stable-emb :
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (f g : A ↪¬¬ B) 
  htpy-double-negation-stable-emb f g  f  g
eq-htpy-double-negation-stable-emb f g =
  map-inv-is-equiv (is-equiv-htpy-eq-double-negation-stable-emb f g)

Precomposing double negation stable embeddings with equivalences

equiv-precomp-double-negation-stable-emb-equiv :
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (e : A  B) 
  (C : UU l3)  (B ↪¬¬ C)  (A ↪¬¬ C)
equiv-precomp-double-negation-stable-emb-equiv e C =
  equiv-Σ
    ( is-double-negation-stable-emb)
    ( equiv-precomp e C)
    ( λ g 
      equiv-iff-is-prop
        ( is-prop-is-double-negation-stable-emb g)
        ( is-prop-is-double-negation-stable-emb (g  map-equiv e))
        ( λ H 
          is-double-negation-stable-emb-comp H
            ( is-double-negation-stable-emb-is-equiv (pr2 e)))
        ( λ d 
          is-double-negation-stable-emb-htpy
            ( λ b  ap g (inv (is-section-map-inv-equiv e b)))
            ( is-double-negation-stable-emb-comp
              ( d)
              ( is-double-negation-stable-emb-is-equiv
                ( is-equiv-map-inv-equiv e)))))

Any map out of the empty type is a double negation stable embedding

abstract
  is-double-negation-stable-emb-ex-falso :
    {l : Level} {X : UU l}  is-double-negation-stable-emb (ex-falso {l} {X})
  is-double-negation-stable-emb-ex-falso =
    ( is-emb-ex-falso , is-double-negation-eliminating-map-ex-falso)

double-negation-stable-emb-ex-falso :
  {l : Level} {X : UU l}  empty ↪¬¬ X
double-negation-stable-emb-ex-falso =
  ( ex-falso , is-double-negation-stable-emb-ex-falso)

double-negation-stable-emb-is-empty :
  {l1 l2 : Level} {A : UU l1} {B : UU l2}  is-empty A  A ↪¬¬ B
double-negation-stable-emb-is-empty {A = A} f =
  map-equiv
    ( equiv-precomp-double-negation-stable-emb-equiv (equiv-is-empty f id) _)
    ( double-negation-stable-emb-ex-falso)

The map on total spaces induced by a family of double negation stable embeddings is a double negation stable embedding

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : A  UU l2} {C : A  UU l3}
  where

  is-double-negation-stable-emb-tot :
    {f : (x : A)  B x  C x} 
    ((x : A)  is-double-negation-stable-emb (f x)) 
    is-double-negation-stable-emb (tot f)
  is-double-negation-stable-emb-tot H =
    ( is-emb-tot (is-emb-is-double-negation-stable-emb  H) ,
      is-double-negation-eliminating-map-tot
        ( is-double-negation-eliminating-map-is-double-negation-stable-emb  H))

  double-negation-stable-emb-tot : ((x : A)  B x ↪¬¬ C x)  Σ A B ↪¬¬ Σ A C
  double-negation-stable-emb-tot f =
    ( tot (map-double-negation-stable-emb  f) ,
      is-double-negation-stable-emb-tot
        ( is-double-negation-stable-emb-map-double-negation-stable-emb  f))

The map on total spaces induced by a double negation stable embedding on the base is a double negation stable embedding

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (C : B  UU l3)
  where

  is-double-negation-stable-emb-map-Σ-map-base :
    {f : A  B} 
    is-double-negation-stable-emb f 
    is-double-negation-stable-emb (map-Σ-map-base f C)
  is-double-negation-stable-emb-map-Σ-map-base H =
    ( is-emb-map-Σ-map-base C (is-emb-is-double-negation-stable-emb H) ,
      is-double-negation-eliminating-map-Σ-map-base C
        ( is-double-negation-eliminating-map-is-double-negation-stable-emb H))

  double-negation-stable-emb-map-Σ-map-base :
    (f : A ↪¬¬ B)  Σ A (C  map-double-negation-stable-emb f) ↪¬¬ Σ B C
  double-negation-stable-emb-map-Σ-map-base f =
    ( map-Σ-map-base (map-double-negation-stable-emb f) C ,
      is-double-negation-stable-emb-map-Σ-map-base
        ( is-double-negation-stable-emb-map-double-negation-stable-emb f))

The functoriality of dependent pair types preserves double negation stable embeddings

module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : A  UU l3} (D : B  UU l4)
  where

  is-double-negation-stable-emb-map-Σ :
    {f : A  B} {g : (x : A)  C x  D (f x)} 
    is-double-negation-stable-emb f 
    ((x : A)  is-double-negation-stable-emb (g x)) 
    is-double-negation-stable-emb (map-Σ D f g)
  is-double-negation-stable-emb-map-Σ {f} {g} F G =
    is-double-negation-stable-emb-left-map-triangle
      ( triangle-map-Σ D f g)
      ( is-double-negation-stable-emb-tot G)
      ( is-double-negation-stable-emb-map-Σ-map-base D F)

  double-negation-stable-emb-Σ :
    (f : A ↪¬¬ B) 
    ((x : A)  C x ↪¬¬ D (map-double-negation-stable-emb f x)) 
    Σ A C ↪¬¬ Σ B D
  double-negation-stable-emb-Σ f g =
    ( ( map-Σ D
        ( map-double-negation-stable-emb f)
        ( map-double-negation-stable-emb  g)) ,
      ( is-double-negation-stable-emb-map-Σ
        ( is-double-negation-stable-emb-map-double-negation-stable-emb f)
        ( is-double-negation-stable-emb-map-double-negation-stable-emb  g)))

Products of double negation stable embeddings are double negation stable embeddings

module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3} {D : UU l4}
  where

  is-double-negation-stable-emb-map-product :
    {f : A  B} {g : C  D} 
    is-double-negation-stable-emb f 
    is-double-negation-stable-emb g 
    is-double-negation-stable-emb (map-product f g)
  is-double-negation-stable-emb-map-product (eF , dF) (eG , dG) =
    ( is-emb-map-product eF eG ,
      is-double-negation-eliminating-map-product dF dG)

  double-negation-stable-emb-product :
    A ↪¬¬ B  C ↪¬¬ D  A × C ↪¬¬ B × D
  double-negation-stable-emb-product (f , F) (g , G) =
    ( map-product f g , is-double-negation-stable-emb-map-product F G)

Coproducts of double negation stable embeddings are double negation stable embeddings

module _
  {l1 l2 l1' l2' : Level} {A : UU l1} {B : UU l2} {A' : UU l1'} {B' : UU l2'}
  where

abstract
  is-double-negation-stable-emb-map-coproduct :
    {l1 l2 l3 l4 : Level}
    {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
    {f : A  B} {g : X  Y} 
    is-double-negation-stable-emb f 
    is-double-negation-stable-emb g 
    is-double-negation-stable-emb (map-coproduct f g)
  is-double-negation-stable-emb-map-coproduct (eF , dF) (eG , dG) =
    ( is-emb-map-coproduct eF eG ,
      is-double-negation-eliminating-map-coproduct dF dG)

Double negation stable embeddings are closed under base change

module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {C : UU l3} {D : UU l4}
  {f : A  B} {g : C  D}
  where

  is-double-negation-stable-prop-map-base-change :
    cartesian-hom-arrow g f 
    is-double-negation-stable-prop-map f 
    is-double-negation-stable-prop-map g
  is-double-negation-stable-prop-map-base-change α F d =
    is-double-negation-stable-prop-equiv
      ( equiv-fibers-cartesian-hom-arrow g f α d)
      ( F (map-codomain-cartesian-hom-arrow g f α d))

  is-double-negation-stable-emb-base-change :
    cartesian-hom-arrow g f 
    is-double-negation-stable-emb f 
    is-double-negation-stable-emb g
  is-double-negation-stable-emb-base-change α F =
    is-double-negation-stable-emb-is-double-negation-stable-prop-map
      ( is-double-negation-stable-prop-map-base-change α
        ( is-double-negation-stable-prop-map-is-double-negation-stable-emb F))

Double negation stable embeddings are closed under retracts of maps

module _
  {l1 l2 l3 l4 : Level} {A : UU l1} {B : UU l2} {X : UU l3} {Y : UU l4}
  {f : A  B} {g : X  Y}
  where

  is-double-negation-stable-prop-map-retract-map :
    f retract-of-map g 
    is-double-negation-stable-prop-map g 
    is-double-negation-stable-prop-map f
  is-double-negation-stable-prop-map-retract-map R G x =
    is-double-negation-stable-prop-retract
      ( retract-fiber-retract-map f g R x)
      ( G (map-codomain-inclusion-retract-map f g R x))

  is-double-negation-stable-emb-retract-map :
    f retract-of-map g 
    is-double-negation-stable-emb g 
    is-double-negation-stable-emb f
  is-double-negation-stable-emb-retract-map R G =
    is-double-negation-stable-emb-is-double-negation-stable-prop-map
      ( is-double-negation-stable-prop-map-retract-map R
        ( is-double-negation-stable-prop-map-is-double-negation-stable-emb G))

A type is a double negation stable proposition if and only if its terminal map is a double negation stable embedding

module _
  {l : Level} {A : UU l}
  where

  is-double-negation-stable-prop-is-double-negation-stable-emb-terminal-map :
    is-double-negation-stable-emb (terminal-map A) 
    is-double-negation-stable-prop A
  is-double-negation-stable-prop-is-double-negation-stable-emb-terminal-map H =
    is-double-negation-stable-prop-equiv'
      ( equiv-fiber-terminal-map star)
      ( is-double-negation-stable-prop-map-is-double-negation-stable-emb H star)

  is-double-negation-stable-emb-terminal-map-is-double-negation-stable-prop :
    is-double-negation-stable-prop A 
    is-double-negation-stable-emb (terminal-map A)
  is-double-negation-stable-emb-terminal-map-is-double-negation-stable-prop H =
    is-double-negation-stable-emb-is-double-negation-stable-prop-map
      ( λ y 
        is-double-negation-stable-prop-equiv (equiv-fiber-terminal-map y) H)

If a dependent sum of propositions over a proposition is double negation stable, then the family is a family of double negation stable propositions

module _
  {l1 l2 : Level} (P : Prop l1) (Q : type-Prop P  Prop l2)
  where

  is-double-negation-stable-prop-family-has-double-negation-elim-Σ :
    has-double-negation-elim (Σ (type-Prop P) (type-Prop  Q)) 
    (p : type-Prop P)  has-double-negation-elim (type-Prop (Q p))
  is-double-negation-stable-prop-family-has-double-negation-elim-Σ H p =
    has-double-negation-elim-equiv'
      ( equiv-fiber-pr1 (type-Prop  Q) p)
      ( is-double-negation-eliminating-map-is-double-negation-stable-emb
        ( is-double-negation-stable-emb-right-factor'
          ( is-double-negation-stable-emb-terminal-map-is-double-negation-stable-prop
            ( is-prop-Σ (is-prop-type-Prop P) (is-prop-type-Prop  Q) , H))
          ( is-emb-terminal-map-is-prop (is-prop-type-Prop P)))
          ( p))

Recent changes