Semidecidability: constructive taboos, choice principles and closure properties
===============================================================================

Tom de Jong, October–November 2021.
Refactored: January 2022.

We investigate constructive taboos surrounding semidecidability.

In particular, we try to investigate what form of countable choice, if any, is
necessary for the semidecidable propositions to be closed under countable joins.

Before we do that, we relate Bishop's Limited Principle of Omniscience (LPO),
Markov's Principle (MP) and strong Brouwer-Kripke Schema (BKS⁺) to properties of
the type of semidecidable propositions. (See Appendix II of
CantorSchroederBernstein.lagda for more on BKS⁺.)

Moreover, we formalize [Theorem 3, EK2017] which says that the semidecidable
propositions are closed under Σ if and only if a certain weak choice principle,
called Escardo Knapp Choice here, holds.

The table of contents is as follows:

∗ Part I   Basic definitions and properties of semidecidablity (structure)

∗ Part II  Formulating LPO, MP and BKS⁺ in terms of the type of semidecidability
           propositions having/being a particular subtype.

∗ Part III LPO, MP, BKS⁺ and closure properties of the type of semidecidable
           propositions.

∗ Part IV  Escardo Knapp Choice, the dominance axiom and closure under Σ
           (Formalization of some results by Escardó and Knapp [EK2017])

∗ Part V   (Subsingleton) Countable choice and closure under (subsingleton)
           countable joins

A summary of implications between weak choice principles and closure conditions
of semidecidable propositions can be found at the end of Part V, just before the
two closing remarks.

NB: is-semidecidable is called isRosolini in [EK2017], because the term
semidecidability is already used in computability theory.

References
──────────

[Bauer2006] Andrej Bauer, "First Steps in Synthetic Computability Theory",
            Electronic Notes in Theoretical Computer Science, volume 155,
            pages 5–13, 2006. Proceedings of the 21st Annual Conference on
            Mathematical Foundations of Programming Semantics (MFPS XXI).
            doi:10.1016/j.entcs.2005.11.049

[EK2017] Martín H. Escardó and Cory M. Knapp, "Partial Elements and Recursion
         via Dominances in Univalent Type Theory", In Valentin Goranko and Mads
         Dam, editors, 26th EACSL Annual Conference on Computer Science Logic
         (CSL 2017), volume 82 of Leibniz International Proceedings in
         Informatics (LIPIcs), pages 21:1–21:16.
         Schloss Dagstuhl–Leibniz-Zentrum für Informatik, 2017.
         doi:10.4230/LIPIcs.CSL.2017.21.

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import MLTT.Spartan

open import UF.DiscreteAndSeparated
open import UF.Equiv
open import UF.Equiv-FunExt
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Powerset
open import UF.NotNotStablePropositions
open import UF.PropTrunc
open import UF.Sets
open import UF.Sets-Properties
open import UF.SubtypeClassifier
open import UF.SubtypeClassifier-Properties
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.UniverseEmbedding

open import Fin.Topology
open import Fin.Variation
open import MLTT.Two-Properties
open import Naturals.Binary hiding (_+_)
open import Naturals.Order
open import Notation.Order
open import NotionsOfDecidability.Decidable
open import NotionsOfDecidability.DecidableClassifier
open import NotionsOfDecidability.Complemented
open import TypeTopology.CompactTypes

\end{code}

Part I: Basic definitions and properties of semidecidablity (structure).

\begin{code}

module NotionsOfDecidability.SemiDecidable
        (fe  : Fun-Ext)
        (pe  : Prop-Ext)
        (pt  : propositional-truncations-exist)
       where

fe' : FunExt
fe' 𝓤 𝓥 = fe

open PropositionalTruncation pt
open import UF.ImageAndSurjection pt

semidecidability-structure : (X : 𝓤 ̇ ) → 𝓤 ̇
semidecidability-structure X = Σ α ꞉ (ℕ → 𝟚) , X ≃ (∃ n ꞉ ℕ , α n ＝ ₁)

semidecidability-structure' : (𝓣 : Universe) (X : 𝓤 ̇ ) → 𝓣 ⁺ ⊔ 𝓤 ̇
semidecidability-structure' 𝓣 X = Σ A ꞉ (ℕ → Ω 𝓣) , is-complemented-subset A
                                                  × (X ≃ (∃ n ꞉ ℕ , n ∈ A))

is-semidecidable : (X : 𝓤 ̇ ) → 𝓤 ̇
is-semidecidable X = ∥ semidecidability-structure X ∥

is-semidecidable' : (𝓣 : Universe) (X : 𝓤 ̇ ) → 𝓣 ⁺ ⊔ 𝓤 ̇
is-semidecidable' 𝓣 X = ∥ semidecidability-structure' 𝓣 X ∥

\end{code}

The difference between property and structure will be important in our
discussions regarding countable choice, as we will see later.

We proceed by showing that the primed versions are equivalent to the unprimed
versions above.

\begin{code}

semidecidability-structure-≃ : {𝓣 : Universe} {X : 𝓤 ̇ }
                             → semidecidability-structure X
                             ≃ semidecidability-structure' 𝓣 X
semidecidability-structure-≃ {𝓤} {𝓣} {X} =
 (Σ α ꞉ (ℕ → 𝟚) , X ≃ (∃ n ꞉ ℕ , α n ＝ ₁))                           ≃⟨ I   ⟩
 (Σ 𝔸 ꞉ (Σ A ꞉ (ℕ → Ω 𝓣) , is-complemented-subset A)
                          , X ≃ (∃ n ꞉ ℕ , ⌜ χ ⌝ 𝔸 n ＝ ₁))           ≃⟨ II  ⟩
 (Σ A ꞉ (ℕ → Ω 𝓣) , Σ δ ꞉ is-complemented-subset A
                         , X ≃ (∃ n ꞉ ℕ , ⌜ χ ⌝ (A , δ) n ＝ ₁))      ≃⟨ III ⟩
 (Σ A ꞉ (ℕ → Ω 𝓣) , is-complemented-subset A × (X ≃ (∃ n ꞉ ℕ , n ∈ A))) ■
  where
   χ : (Σ A ꞉ (ℕ → Ω 𝓣) , is-complemented-subset A) ≃ (ℕ → 𝟚)
   χ = ≃-sym (𝟚-classifies-decidable-subsets fe fe pe)
   I   = ≃-sym (Σ-change-of-variable (λ α → X ≃ (∃ n ꞉ ℕ , α n ＝ ₁))
          ⌜ χ ⌝ (⌜⌝-is-equiv χ))
   II  = Σ-assoc
   III = Σ-cong (λ A → Σ-cong
                (λ δ → ≃-cong-right fe' (∥∥-cong pt (Σ-cong (λ n → κ A δ n)))))
    where
     κ : (A : ℕ → Ω 𝓣) (δ : is-complemented-subset A) (n : ℕ )
       → (⌜ χ ⌝ (A , δ) n ＝ ₁) ≃ (A n holds)
     κ A δ n = logically-equivalent-props-are-equivalent
                    𝟚-is-set (holds-is-prop (A n))
                    (lr-implication (pr₂ lemma)) (rl-implication (pr₂ lemma))
      where
       lemma : ((⌜ χ ⌝ (A , δ) n ＝ ₀) ↔ ¬ (n ∈ A))
             × ((⌜ χ ⌝ (A , δ) n ＝ ₁) ↔   (n ∈ A))
       lemma = 𝟚-classifies-decidable-subsets-values fe fe pe A δ n

is-semidecidable-≃ : {𝓣 : Universe} {X : 𝓤 ̇ }
                   → is-semidecidable X ≃ is-semidecidable' 𝓣 X
is-semidecidable-≃ = ∥∥-cong pt (semidecidability-structure-≃)

\end{code}

We proceed by proving some basic lemmas about semidecidability (structure).

\begin{code}

prop-if-semidecidability-structure : {X : 𝓤 ̇ }
                                   → semidecidability-structure X → is-prop X
prop-if-semidecidability-structure σ = equiv-to-prop (pr₂ σ) ∥∥-is-prop

prop-if-semidecidable : {X : 𝓤 ̇ } → is-semidecidable X → is-prop X
prop-if-semidecidable = ∥∥-rec (being-prop-is-prop fe)
                               prop-if-semidecidability-structure

being-semidecidable-is-prop : {X : 𝓤 ̇ } → is-prop (is-semidecidable X)
being-semidecidable-is-prop = ∥∥-is-prop

semidecidability-structure-cong : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                                → X ≃ Y
                                → semidecidability-structure X
                                → semidecidability-structure Y
semidecidability-structure-cong {𝓤} {𝓥} f (ϕ , e) = (ϕ , (≃-sym f ● e))

is-semidecidable-cong : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                      → X ≃ Y
                      → is-semidecidable X
                      → is-semidecidable Y
is-semidecidable-cong = ∥∥-functor ∘ semidecidability-structure-cong

\end{code}

The types 𝟘 and 𝟙 are semidecidable and hence, so are all singletons, empty
types and all decidable propositions.

\begin{code}

𝟘-has-semidecidability-structure' : semidecidability-structure (𝟘 {𝓤₀})
𝟘-has-semidecidability-structure' = ϕ , e
 where
  ϕ : ℕ → 𝟚
  ϕ _ = ₀
  ϕ-is-not-₁-anywhere : ¬ (∃ n ꞉ ℕ , ϕ n ＝ ₁)
  ϕ-is-not-₁-anywhere = forall₀-implies-not-exists₁ ϕ (λ _ → refl)
  e : 𝟘 ≃ (∃ n ꞉ ℕ , ϕ n ＝ ₁)
  e = ≃-sym (lr-implication negations-are-equiv-to-𝟘 ϕ-is-not-₁-anywhere)

𝟘-has-semidecidability-structure : semidecidability-structure (𝟘 {𝓤})
𝟘-has-semidecidability-structure {𝓤} =
 semidecidability-structure-cong one-𝟘-only 𝟘-has-semidecidability-structure'

𝟘-is-semidecidable : is-semidecidable (𝟘 {𝓤})
𝟘-is-semidecidable = ∣ 𝟘-has-semidecidability-structure ∣

empty-types-have-semidecidability-structure : {X : 𝓤 ̇ } → is-empty X
                                            → semidecidability-structure X
empty-types-have-semidecidability-structure e =
 semidecidability-structure-cong
  (≃-sym (lr-implication negations-are-equiv-to-𝟘 e))
  𝟘-has-semidecidability-structure

empty-types-are-semidecidable : {X : 𝓤 ̇ } → is-empty X → is-semidecidable X
empty-types-are-semidecidable e =
 ∣ empty-types-have-semidecidability-structure e ∣

𝟙-has-semidecidability-structure : semidecidability-structure (𝟙 {𝓤})
𝟙-has-semidecidability-structure = ϕ , e
 where
  ϕ : ℕ → 𝟚
  ϕ _ = ₁
  w : ∃ n ꞉ ℕ , ϕ n ＝ ₁
  w = ∣ 0 , refl ∣
  e : 𝟙 ≃ (∃ n ꞉ ℕ , ϕ n ＝ ₁)
  e = ≃-sym (lr-implication singletons-are-equiv-to-𝟙
              (w , (∥∥-is-prop w)))

𝟙-is-semidecidable : is-semidecidable (𝟙 {𝓤})
𝟙-is-semidecidable = ∣ 𝟙-has-semidecidability-structure ∣

singletons-have-semidecidability-structure : {X : 𝓤 ̇ } → is-singleton X
                                           → semidecidability-structure X
singletons-have-semidecidability-structure {𝓤} i =
 semidecidability-structure-cong
  (≃-sym (lr-implication singletons-are-equiv-to-𝟙 i))
  (𝟙-has-semidecidability-structure {𝓤})

singletons-are-semidecidable : {X : 𝓤 ̇ } → is-singleton X → is-semidecidable X
singletons-are-semidecidable i = ∣ singletons-have-semidecidability-structure i ∣

decidable-props-are-semidecidable : {X : 𝓤 ̇ }
                                  → is-prop X
                                  → is-decidable X
                                  → is-semidecidable X
decidable-props-are-semidecidable i (inl  x) = singletons-are-semidecidable (x , i x)
decidable-props-are-semidecidable i (inr nx) = empty-types-are-semidecidable nx

\end{code}

If X and its negation ¬ X are semidecidable propositions, then so decidability
of X becomes semidecidable.

\begin{code}

decidability-is-semidecidable : (X : 𝓤 ̇ )
                              → is-semidecidable X
                              → is-semidecidable (¬ X)
                              → is-semidecidable (is-decidable X)
decidability-is-semidecidable X σ τ = ∥∥-rec being-semidecidable-is-prop ψ τ
 where
  ψ : semidecidability-structure (¬ X) → is-semidecidable (is-decidable X)
  ψ (β , g) = ∥∥-functor ϕ σ
   where
    ϕ : semidecidability-structure X → semidecidability-structure (is-decidable X)
    ϕ (α , f) = γ , h
     where
      γ : ℕ → 𝟚
      γ n = max𝟚 (α n) (β n)
      X-is-prop : is-prop X
      X-is-prop = prop-if-semidecidable σ
      dec-of-X-is-prop : is-prop (is-decidable X)
      dec-of-X-is-prop = decidability-of-prop-is-prop fe X-is-prop
      h : is-decidable X ≃ (∃ n ꞉ ℕ , γ n ＝ ₁)
      h = logically-equivalent-props-are-equivalent
           dec-of-X-is-prop ∥∥-is-prop u v
       where
        u : is-decidable X → ∃ n ꞉ ℕ , γ n ＝ ₁
        u (inl  x) = ∥∥-functor
                      (λ (n , b) → n , max𝟚-lemma-converse (inl b))
                      (⌜ f ⌝ x)
        u (inr nx) = ∥∥-functor
                      (λ (n , b) → n , max𝟚-lemma-converse (inr b))
                      (⌜ g ⌝ nx)
        v : ∃ n ꞉ ℕ , γ n ＝ ₁ → is-decidable X
        v = ∥∥-rec dec-of-X-is-prop ν
         where
          ν : (Σ n ꞉ ℕ , γ n ＝ ₁) → is-decidable X
          ν (n , p) = cases (λ a → inl (⌜ f ⌝⁻¹ ∣ n , a ∣))
                            (λ b → inr (⌜ g ⌝⁻¹ ∣ n , b ∣))
                            (max𝟚-lemma p)

\end{code}

The following pairing lemma comes in useful, especially when we are given a
ℕ-indexed family Xₙ where each Xₙ is equiped with semidecidability structure.

\begin{code}

semidecidability-pairing-lemma : {X : 𝓤 ̇ }
  → (Σ Ψ ꞉ (ℕ → ℕ → 𝟚) , X ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ n m ＝ ₁))
  ≃ semidecidability-structure X
semidecidability-pairing-lemma {𝓤} {X} =
 (Σ Ψ ꞉ (ℕ → ℕ → 𝟚) , X ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ n m            ＝ ₁)) ≃⟨ I   ⟩
 (Σ Ψ ꞉ (ℕ × ℕ → 𝟚) , X ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ (n , m)        ＝ ₁)) ≃⟨ II  ⟩
 (Σ ϕ ꞉ (ℕ → 𝟚)     , X ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , ⌜ e₂ ⌝ ϕ (n , m) ＝ ₁)) ≃⟨ III ⟩
 (Σ ϕ ꞉ (ℕ → 𝟚)     , X ≃ (∃ k ꞉ ℕ           , ϕ k              ＝ ₁)) ■
 where
  e₁ : (ℕ × ℕ → 𝟚) ≃ (ℕ → ℕ → 𝟚)
  e₁ = curry-uncurry fe'
  e₂ : (ℕ → 𝟚) ≃ (ℕ × ℕ → 𝟚)
  e₂ = →cong'' fe fe (≃-sym pairing)
  I  = ≃-sym (Σ-change-of-variable (λ Ψ → X ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ n m ＝ ₁))
                                   ⌜ e₁ ⌝ (⌜⌝-is-equiv e₁))
  II = ≃-sym (Σ-change-of-variable
               (λ Ψ → X ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ (n , m) ＝ ₁))
               ⌜ e₂ ⌝ (⌜⌝-is-equiv e₂))
  III = Σ-cong (λ ϕ → ≃-cong-right fe' (∥∥-cong pt (lemma ϕ)))
   where
    ρ : ℕ × ℕ ≃ ℕ
    ρ = pairing
    σ : (ℕ → 𝟚) → (ℕ × ℕ → 𝟚)
    σ = ⌜ e₂ ⌝
    lemma : (ϕ : ℕ → 𝟚)
          → (Σ n ꞉ ℕ , Σ m ꞉ ℕ , σ ϕ (n , m) ＝ ₁) ≃ (Σ k ꞉ ℕ , ϕ k ＝ ₁)
    lemma ϕ = (Σ n ꞉ ℕ , Σ m ꞉ ℕ , σ ϕ (n , m)           ＝ ₁) ≃⟨ ≃-sym Σ-assoc ⟩
              (Σ p ꞉ ℕ × ℕ       , σ ϕ p                 ＝ ₁) ≃⟨ ⦅i⦆           ⟩
              (Σ k ꞉ ℕ           , σ ϕ (⌜ ρ ⌝⁻¹ k)       ＝ ₁) ≃⟨ ≃-refl _      ⟩
              (Σ k ꞉ ℕ           , ϕ (⌜ ρ ⌝ (⌜ ρ ⌝⁻¹ k)) ＝ ₁) ≃⟨ ⦅ii⦆          ⟩
              (Σ k ꞉ ℕ           , ϕ k                   ＝ ₁) ■
     where
      ⦅i⦆  = ≃-sym (Σ-change-of-variable (λ p → σ ϕ p ＝ ₁)
                     ⌜ ρ ⌝⁻¹ (⌜⌝⁻¹-is-equiv ρ))
      ⦅ii⦆ = Σ-cong (λ k → ＝-cong-l (ϕ ((⌜ ρ ⌝ ∘ ⌜ ρ ⌝⁻¹) k)) ₁
                           (ap ϕ (≃-sym-is-rinv ρ k)))

\end{code}

Part II: We will shortly study Bishop's Limited Principle of Omniscience (LPO),
Markov's Principle (MP) and strong Brouwer-Kripke schema (BKS⁺) and their
relations to semidecidability.

Before we do so we consider various subtypes of Ω, namely

∗ Ωᵈᵉᶜ - the type of decidable propositions, which is equivalent to 𝟚
∗ Ω¬¬  - the type of ¬¬-stable propositions
∗ Ωˢᵈ  - the type of semidecidable propositions

In short, we have the following diagram

𝟚 ≃ Ωᵈᵉᶜ ⟶ Ωˢᵈ --→ Ω¬¬
               ↘   ↓
                   Ω

where
∗ the dotted map exists (and makes the triangle commute) if and only if Markov's
  Principle holds;
∗ all maps (including the dotted one, if it exists) are embeddings;
∗ the embedding Ωᵈᵉᶜ ⟶ Ωˢᵈ is an equivalence if and only if LPO holds;
∗ the embedding Ωˢᵈ  ⟶ Ω   is an equivalence if and only if BKS⁺ holds.

\begin{code}

open import UF.Embeddings
open import Notation.CanonicalMap

instance
 canonical-map-Ω¬¬-to-Ω : Canonical-Map (Ω¬¬ 𝓤) (Ω 𝓤)
 ι {{canonical-map-Ω¬¬-to-Ω}} = Ω¬¬-to-Ω

Ωˢᵈ : (𝓤 : Universe) → 𝓤 ⁺ ̇
Ωˢᵈ 𝓤 = Σ X ꞉ 𝓤 ̇  , is-semidecidable X

Ωˢᵈ-to-Ω : Ωˢᵈ 𝓤 → Ω 𝓤
Ωˢᵈ-to-Ω (X , σ) = (X , prop-if-semidecidable σ)

instance
 canonical-map-Ωˢᵈ-to-Ω : Canonical-Map (Ωˢᵈ 𝓤) (Ω 𝓤)
 ι {{canonical-map-Ωˢᵈ-to-Ω}} = Ωˢᵈ-to-Ω

Ωˢᵈ-to-Ω-left-cancellable : left-cancellable (canonical-map (Ωˢᵈ 𝓤) (Ω 𝓤))
Ωˢᵈ-to-Ω-left-cancellable {𝓤} {(X , σ)} {(Y , τ)} e =
 to-subtype-＝ (λ _ → being-semidecidable-is-prop) (ap pr₁ e)

Ωˢᵈ-to-Ω-is-embedding : is-embedding (canonical-map (Ωˢᵈ 𝓤) (Ω 𝓤))
Ωˢᵈ-to-Ω-is-embedding = lc-maps-into-sets-are-embeddings ι
                         Ωˢᵈ-to-Ω-left-cancellable (Ω-is-set fe pe)

Ωˢᵈ-is-set : is-set (Ωˢᵈ 𝓤)
Ωˢᵈ-is-set = subtypes-of-sets-are-sets' ι Ωˢᵈ-to-Ω-left-cancellable
              (Ω-is-set fe pe)

Ωᵈᵉᶜ : (𝓤 : Universe) → 𝓤 ⁺ ̇
Ωᵈᵉᶜ 𝓤 = Σ P ꞉ Ω 𝓤 , is-decidable (P holds)

Ωᵈᵉᶜ-to-Ωˢᵈ : Ωᵈᵉᶜ 𝓤 → Ωˢᵈ 𝓤
Ωᵈᵉᶜ-to-Ωˢᵈ ((P , i) , d) = (P , decidable-props-are-semidecidable i d)

instance
 canonical-map-Ωᵈᵉᶜ-to-Ωˢᵈ : Canonical-Map (Ωᵈᵉᶜ 𝓤) (Ωˢᵈ 𝓤)
 ι {{canonical-map-Ωᵈᵉᶜ-to-Ωˢᵈ}} = Ωᵈᵉᶜ-to-Ωˢᵈ

Ωᵈᵉᶜ-to-Ωˢᵈ-left-cancellable : left-cancellable (canonical-map (Ωᵈᵉᶜ 𝓤) (Ωˢᵈ 𝓤))
Ωᵈᵉᶜ-to-Ωˢᵈ-left-cancellable {𝓤} {(X , _)} {(Y , _)} e =
 to-subtype-＝ (λ (P , i) → decidability-of-prop-is-prop fe i)
              (Ω-extensionality pe fe
               (idtofun (X holds) (Y holds) (ap pr₁ e))
               (idtofun (Y holds) (X holds) (ap pr₁ (e ⁻¹))))

Ωᵈᵉᶜ-to-Ωˢᵈ-is-embedding : is-embedding (canonical-map (Ωᵈᵉᶜ 𝓤) (Ωˢᵈ 𝓤))
Ωᵈᵉᶜ-to-Ωˢᵈ-is-embedding = lc-maps-into-sets-are-embeddings ι
                            Ωᵈᵉᶜ-to-Ωˢᵈ-left-cancellable
                            Ωˢᵈ-is-set

𝟚-to-Ωˢᵈ : 𝟚 → Ωˢᵈ 𝓤
𝟚-to-Ωˢᵈ = Ωᵈᵉᶜ-to-Ωˢᵈ ∘ ⌜ 𝟚-is-the-type-of-decidable-propositions fe pe ⌝

instance
 canonical-map-𝟚-to-Ωˢᵈ : Canonical-Map 𝟚 (Ωˢᵈ 𝓤)
 ι {{canonical-map-𝟚-to-Ωˢᵈ}} = 𝟚-to-Ωˢᵈ

𝟚-to-Ωˢᵈ-is-embedding : is-embedding (canonical-map 𝟚 (Ωˢᵈ 𝓤))
𝟚-to-Ωˢᵈ-is-embedding {𝓤} =
 ∘-is-embedding (equivs-are-embeddings ⌜ χ ⌝ (⌜⌝-is-equiv χ))
                Ωᵈᵉᶜ-to-Ωˢᵈ-is-embedding
  where
   χ : 𝟚 ≃ Ωᵈᵉᶜ 𝓤
   χ = 𝟚-is-the-type-of-decidable-propositions fe pe

\end{code}

Part II(a): LPO and semidecidability

\begin{code}

LPO : 𝓤₀ ̇
LPO = (α : ℕ → 𝟚) → is-decidable (∃ n ꞉ ℕ , α n ＝ ₁)

LPO-is-prop : is-prop LPO
LPO-is-prop = Π-is-prop fe (λ α → decidability-of-prop-is-prop fe ∥∥-is-prop)

LPO' : (𝓤 : Universe) → 𝓤 ⁺ ̇
LPO' 𝓤 = (X : 𝓤 ̇ ) → is-semidecidable X → is-decidable X

LPO'-is-prop : is-prop (LPO' 𝓤)
LPO'-is-prop = Π₂-is-prop fe (λ X σ → decidability-of-prop-is-prop fe
                                       (prop-if-semidecidable σ))

\end{code}

LPO is a more traditional way of formulating the Limited Principle of
Omniscience, but LPO' is perhaps conceptually clearer and is the formulation
that is most convenient for us here. The two formulations are equivalent as
proved below.

\begin{code}

LPO-equivalence : LPO ≃ LPO' 𝓤
LPO-equivalence {𝓤} = logically-equivalent-props-are-equivalent
                       LPO-is-prop LPO'-is-prop f g
 where
  f : LPO → LPO' 𝓤
  f lpo X σ = ∥∥-rec (decidability-of-prop-is-prop fe
                       (prop-if-semidecidable σ)) γ σ
   where
    γ : semidecidability-structure X → is-decidable X
    γ (α , e) = decidable-cong (≃-sym e) (lpo α)
  g : LPO' 𝓤 → LPO
  g τ α = decidable-cong (Lift-≃ 𝓤 X) (τ X' σ')
   where
    X : 𝓤₀ ̇
    X = ∃ n ꞉ ℕ , α n ＝ ₁
    X' : 𝓤 ̇
    X' = Lift 𝓤 X
    σ' : is-semidecidable X'
    σ' = is-semidecidable-cong (≃-sym (Lift-≃ 𝓤 X)) ∣ α , ≃-refl X ∣

\end{code}

By the above equivalence it follows that having LPO' in any universe is
equivalent to having LPO' in any other universe.

\begin{code}

LPO-across-universes : {𝓤 𝓥 : Universe} → LPO' 𝓤 ≃ LPO' 𝓥
LPO-across-universes {𝓤} {𝓥} = LPO' 𝓤  ≃⟨ ≃-sym LPO-equivalence ⟩
                               LPO     ≃⟨ LPO-equivalence       ⟩
                               LPO' 𝓥  ■

\end{code}

Finally, we characterize LPO as saying exactly that the canonical map from 𝟚 to
the type of semidecidable propositions, Ωˢᵈ, is an equivalence.

\begin{code}

LPO-in-terms-of-Ωᵈᵉᶜ-and-Ωˢᵈ : LPO' 𝓤 ≃ is-equiv (canonical-map (Ωᵈᵉᶜ 𝓤) (Ωˢᵈ 𝓤))
LPO-in-terms-of-Ωᵈᵉᶜ-and-Ωˢᵈ {𝓤} = logically-equivalent-props-are-equivalent
                                    LPO'-is-prop
                                    (being-equiv-is-prop fe' ι)
                                    ⦅⇒⦆ ⦅⇐⦆
   where
    ⦅⇒⦆ : LPO' 𝓤 → is-equiv ι
    ⦅⇒⦆ lpo = surjective-embeddings-are-equivs ι Ωᵈᵉᶜ-to-Ωˢᵈ-is-embedding
              (λ (X , σ) → ∣ ((X , prop-if-semidecidable σ) , lpo X σ)
                           , to-subtype-＝ (λ _ → being-semidecidable-is-prop)
                              refl ∣)
    ⦅⇐⦆ : is-equiv ι → LPO' 𝓤
    ⦅⇐⦆ ι-is-equiv X σ = transport is-decidable e Y-is-dec
     where
      β : Ωˢᵈ 𝓤 → Ωᵈᵉᶜ 𝓤
      β = inverse ι ι-is-equiv
      Y : 𝓤 ̇
      Y = pr₁ (β (X , σ)) holds
      Y-is-dec : is-decidable Y
      Y-is-dec = pr₂ (β (X , σ))
      e : Y ＝ X
      e = ap pr₁ (inverses-are-sections ι ι-is-equiv (X , σ))

LPO-in-terms-of-𝟚-and-Ωˢᵈ : LPO ≃ is-equiv (canonical-map 𝟚 (Ωˢᵈ 𝓤))
LPO-in-terms-of-𝟚-and-Ωˢᵈ {𝓤} = logically-equivalent-props-are-equivalent
                                 LPO-is-prop (being-equiv-is-prop fe' ι)
                                 ⦅⇒⦆ ⦅⇐⦆
 where
  χ : 𝟚 ≃ Ωᵈᵉᶜ 𝓤
  χ = 𝟚-is-the-type-of-decidable-propositions fe pe
  ⦅⇒⦆ : LPO → is-equiv ι
  ⦅⇒⦆ lpo = ∘-is-equiv (⌜⌝-is-equiv χ)
            (⌜ LPO-in-terms-of-Ωᵈᵉᶜ-and-Ωˢᵈ ⌝ (⌜ LPO-equivalence ⌝ lpo))
  ⦅⇐⦆ : is-equiv ι → LPO
  ⦅⇐⦆ i = ⌜ LPO-equivalence ⌝⁻¹
          (⌜ LPO-in-terms-of-Ωᵈᵉᶜ-and-Ωˢᵈ ⌝⁻¹
            (≃-2-out-of-3-right (⌜⌝-is-equiv χ) i))

\end{code}

Part II(b): Markov's Principle and semidecidability.

As with LPO, we introduce two formulations of Markov's Principle and prove their
equivalence.

\begin{code}

MP : 𝓤₀ ̇
MP = (α : ℕ → 𝟚) → ¬¬-stable (∃ n ꞉ ℕ , α n ＝ ₁)

MP-is-prop : is-prop MP
MP-is-prop = Π₂-is-prop fe (λ α h → ∥∥-is-prop)

MP' : (𝓤 : Universe) → 𝓤 ⁺ ̇
MP' 𝓤 = ((X : 𝓤 ̇ ) → is-semidecidable X → ¬¬-stable X)

MP'-is-prop : is-prop (MP' 𝓤)
MP'-is-prop = Π₃-is-prop fe (λ X σ h → prop-if-semidecidable σ)

MP-equivalence : MP ≃ MP' 𝓤
MP-equivalence {𝓤} = logically-equivalent-props-are-equivalent
                           MP-is-prop MP'-is-prop f g
 where
  f : MP → MP' 𝓤
  f mp X σ nnX = ∥∥-rec (prop-if-semidecidable σ) γ σ
   where
    γ : semidecidability-structure X → X
    γ (α , e) = ⌜ e ⌝⁻¹ (mp α (¬¬-functor ⌜ e ⌝ nnX))
  g : MP' 𝓤 → MP
  g τ α = ¬¬-stable-≃ (Lift-≃ 𝓤 X) (τ X' σ')
   where
    X : 𝓤₀ ̇
    X = ∃ n ꞉ ℕ , α n ＝ ₁
    X' : 𝓤 ̇
    X' = Lift 𝓤 X
    σ' : is-semidecidable X'
    σ' = is-semidecidable-cong (≃-sym (Lift-≃ 𝓤 X)) ∣ α , ≃-refl X ∣

MP-across-universes : {𝓤 𝓥 : Universe} → MP' 𝓤 ≃ MP' 𝓥
MP-across-universes {𝓤} {𝓥} = MP' 𝓤  ≃⟨ ≃-sym MP-equivalence ⟩
                               MP    ≃⟨ MP-equivalence       ⟩
                               MP' 𝓥 ■

\end{code}

The below is a formalization of [Proposition 3.17, Bauer2006], specifically of
the equivalence of items (i) and (iii) there.

\begin{code}

MP-in-terms-of-Ω¬¬-and-Ω : MP ≃ (Σ e ꞉ (Ωˢᵈ 𝓤 → Ω¬¬ 𝓤) , Ωˢᵈ-to-Ω ∼ Ω¬¬-to-Ω ∘ e)
MP-in-terms-of-Ω¬¬-and-Ω {𝓤} = MP-equivalence ● claim
 where
  factors-is-prop : is-prop (Σ e ꞉ (Ωˢᵈ 𝓤 → Ω¬¬ 𝓤) , Ωˢᵈ-to-Ω ∼ Ω¬¬-to-Ω ∘ e)
  factors-is-prop (e , p) (e' , p') =
   to-subtype-＝ (λ f → Π-is-prop fe (λ _ → Ω-is-set fe pe))
                (dfunext fe γ)
    where
     γ : e ∼ e'
     γ (X , σ) = to-subtype-＝
                  (λ P → being-¬¬-stable-is-prop fe (holds-is-prop P))
                  (pr₁ (e (X , σ))       ＝⟨ refl           ⟩
                   Ω¬¬-to-Ω (e (X , σ))  ＝⟨ (p (X , σ)) ⁻¹ ⟩
                   Ωˢᵈ-to-Ω (X , σ)      ＝⟨ p' (X , σ)     ⟩
                   Ω¬¬-to-Ω (e' (X , σ)) ＝⟨ refl           ⟩
                   pr₁ (e' (X , σ))      ∎)
  claim : MP' 𝓤 ≃ (Σ e ꞉ (Ωˢᵈ 𝓤 → Ω¬¬ 𝓤) , Ωˢᵈ-to-Ω ∼ Ω¬¬-to-Ω ∘ e)
  claim = logically-equivalent-props-are-equivalent MP'-is-prop factors-is-prop
           ⦅⇒⦆ ⦅⇐⦆
   where
    ⦅⇒⦆ : MP' 𝓤 → (Σ e ꞉ (Ωˢᵈ 𝓤 → Ω¬¬ 𝓤) , Ωˢᵈ-to-Ω ∼ Ω¬¬-to-Ω ∘ e)
    ⦅⇒⦆ mp = e , (λ (X , σ) → refl)
     where
      e : Ωˢᵈ 𝓤 → Ω¬¬ 𝓤
      e (X , σ) = (X , prop-if-semidecidable σ) , mp X σ
    ⦅⇐⦆ : (Σ e ꞉ (Ωˢᵈ 𝓤 → Ω¬¬ 𝓤) , Ωˢᵈ-to-Ω ∼ Ω¬¬-to-Ω ∘ e) → MP' 𝓤
    ⦅⇐⦆ (e , p) X σ = transport ¬¬-stable (eq ⁻¹) Y-¬¬-stable
     where
      Y : 𝓤 ̇
      Y = pr₁ (e (X , σ)) holds
      Y-¬¬-stable : ¬¬-stable Y
      Y-¬¬-stable = pr₂ (e (X , σ))
      eq : X ＝ Y
      eq = ap pr₁ (p (X , σ))

\end{code}

NB: The map e : Ωˢᵈ 𝓤 → Ω¬¬ 𝓤 in the type of MP-in-terms-of-Ω¬¬-and-Ω is an
    embedding, because embeddings have the 2-out-of-3 property and
    Ωˢᵈ-to-Ω ∼ Ω¬¬-to-Ω ∘ e is required to hold.

\begin{code}

Ωˢᵈ-to-Ω¬¬-is-embedding : (e : Ωˢᵈ 𝓤 → Ω¬¬ 𝓤)
                        → Ωˢᵈ-to-Ω ∼ Ω¬¬-to-Ω ∘ e
                        → is-embedding e
Ωˢᵈ-to-Ω¬¬-is-embedding e h = factor-is-embedding e Ω¬¬-to-Ω
                               (embedding-closed-under-∼ Ωˢᵈ-to-Ω (Ω¬¬-to-Ω ∘ e)
                                 Ωˢᵈ-to-Ω-is-embedding (λ p → (h p) ⁻¹))
                               (Ω¬¬-to-Ω-is-embedding fe)

\end{code}

Part II(c): Strong Brouwer-Kripke Schema (BKS⁺) and semidecidability.

\begin{code}

BKS⁺ : (𝓤 : Universe) → (𝓤 ⁺) ̇
BKS⁺ 𝓤 = (X : 𝓤 ̇ ) → is-prop X → is-semidecidable X

BKS⁺-is-prop : is-prop (BKS⁺ 𝓤)
BKS⁺-is-prop = Π₂-is-prop fe (λ _ _ → being-semidecidable-is-prop)

BKS⁺-in-terms-of-Ωˢᵈ-and-Ω : BKS⁺ 𝓤 ≃ is-equiv (canonical-map (Ωˢᵈ 𝓤) (Ω 𝓤))
BKS⁺-in-terms-of-Ωˢᵈ-and-Ω {𝓤} =
 logically-equivalent-props-are-equivalent
  BKS⁺-is-prop (being-equiv-is-prop fe' ι) ⦅⇒⦆ ⦅⇐⦆
   where
    ⦅⇒⦆ : BKS⁺ 𝓤 → is-equiv ι
    ⦅⇒⦆ bks = surjective-embeddings-are-equivs ι Ωˢᵈ-to-Ω-is-embedding
              (λ P → ∣ (P holds , bks (P holds) (holds-is-prop P))
                     , to-subtype-＝ (λ _ → being-prop-is-prop fe) refl ∣)
    ⦅⇐⦆ : is-equiv ι → BKS⁺ 𝓤
    ⦅⇐⦆ ι-is-equiv X X-is-prop = transport is-semidecidable e Y-is-semidecidable
     where
      β : Ω 𝓤 → Ωˢᵈ 𝓤
      β = inverse ι ι-is-equiv
      Y : 𝓤 ̇
      Y = pr₁ (β (X , X-is-prop))
      Y-is-semidecidable : is-semidecidable Y
      Y-is-semidecidable = pr₂ (β (X , X-is-prop))
      e : Y ＝ X
      e = ap pr₁ (inverses-are-sections ι ι-is-equiv (X , X-is-prop))

\end{code}

We close part II with some remarks relating BKS⁺ and LPO with excluded middle;
and BKS⁺ and propositional resizing.

NB: We use the formulation LPO' as it is more convient for our purposes, but
recall that we proved LPO' equivalent to LPO.

Somewhat similar results can be found in CantorSchroederBernstein.lagda, where
the observation that BKS⁺ → MP → EM is attributed to Moschovakis. As LPO → MP,
it follows that BKS⁺ → LPO → EM, but we give a direct proof of the latter here.
In particular, we prove EM ≃ BKS⁺ × LPO directly, although this follows from the
fact that EM ≃ BKS⁺ × MP.

\begin{code}

LPO→MP : LPO → MP
LPO→MP lpo α = ¬¬-stable-if-decidable (∃ n ꞉ ℕ , α n ＝ ₁) (lpo α)

open import UF.ClassicalLogic

BKS⁺→LPO→EM : BKS⁺ 𝓤 → LPO' 𝓤 → EM 𝓤
BKS⁺→LPO→EM {𝓤} bks lpo X X-is-prop = lpo X (bks X X-is-prop)

EM→BKS⁺ : EM 𝓤 → BKS⁺ 𝓤
EM→BKS⁺ {𝓤} em X X-is-prop =
 decidable-props-are-semidecidable X-is-prop (em X X-is-prop)

EM→LPO : EM 𝓤 → LPO' 𝓤
EM→LPO {𝓤} em X X-is-semidec = em X (prop-if-semidecidable X-is-semidec)

EM-is-conjunction-of-BKS⁺-and-LPO : EM 𝓤 ≃ BKS⁺ 𝓤 × LPO' 𝓤
EM-is-conjunction-of-BKS⁺-and-LPO =
 logically-equivalent-props-are-equivalent
  (EM-is-prop fe') (×-is-prop BKS⁺-is-prop LPO'-is-prop)
  (λ em → (EM→BKS⁺ em , EM→LPO em))
  (λ (bks , lpo) → BKS⁺→LPO→EM bks lpo)

open import UF.Size

BKS⁺-gives-Propositional-Resizing : BKS⁺ 𝓤
                                  → propositional-resizing 𝓤 𝓤₀
BKS⁺-gives-Propositional-Resizing bks X X-is-prop =
 ∥∥-rec (prop-being-small-is-prop (λ _ → pe) fe' X X-is-prop) γ (bks X X-is-prop)
  where
   γ : semidecidability-structure X → X is 𝓤₀ small
   γ (α , e) = (∃ n ꞉ ℕ , α n ＝ ₁) , (≃-sym e)

\end{code}

Part III: The above taboos (LPO, MP, BKS⁺) and closure properties of the type
of semidecidable propositions.

In order, we consider:
 (1) Closure under negations
 (2) Closure under implications
 (3) Closure under all meets
 (4) Closure under all joins

The special case of countable choice is considered in Part V.

 (1) Closure under negations

\begin{code}

Semidecidable-Closed-Under-Negations : (𝓤 : Universe) → 𝓤 ⁺ ̇
Semidecidable-Closed-Under-Negations 𝓤 = (X : 𝓤 ̇ )
                                       → is-semidecidable X
                                       → is-semidecidable (¬ X)

semidecidable-negations-from-LPO : LPO' 𝓤
                                 → Semidecidable-Closed-Under-Negations 𝓤
semidecidable-negations-from-LPO lpo X σ =
 decidable-props-are-semidecidable (negations-are-props fe)
  (¬-preserves-decidability (lpo X σ))

\end{code}

 It turns out that in the presence of Markov's Principle, the above implication
 can be reversed. In other words, if we accept Markov's Principle, then LPO is
 equivalent to semidecidable propositions being closed under negation.

 I found the proof of this by inspecting the proof of [Theorem 3.21, Bauer2006].

\begin{code}

LPO-from-semidecidable-negations : MP' 𝓤
                                 → Semidecidable-Closed-Under-Negations 𝓤
                                 → LPO' 𝓤
LPO-from-semidecidable-negations mp h X σ = mp (is-decidable X) τ
                                             (all-types-are-¬¬-decidable X)
 where
  τ : is-semidecidable (is-decidable X)
  τ = decidability-is-semidecidable X σ (h X σ)

\end{code}

 (2) Closure under implications

 The situation for implications is very similar, which is not too surprising as
 negations are just particular implications.

\begin{code}

Semidecidable-Closed-Under-Implications : (𝓤 𝓥 : Universe) → (𝓤 ⊔ 𝓥) ⁺ ̇
Semidecidable-Closed-Under-Implications 𝓤 𝓥 = (X : 𝓤 ̇ ) (Y : 𝓥 ̇ )
                                            → is-semidecidable X
                                            → is-semidecidable Y
                                            → is-semidecidable (X → Y)

semidecidable-implications-from-LPO : LPO' 𝓤
                                    → Semidecidable-Closed-Under-Implications
                                       𝓤 𝓤₀
semidecidable-implications-from-LPO lpo X Y σ τ =
 decidable-props-are-semidecidable
  (Π-is-prop fe (λ _ → prop-if-semidecidable τ))
  (→-preserves-decidability (lpo X σ) (⌜ LPO-across-universes ⌝ lpo Y τ))

LPO-from-semidecidable-implications : MP' 𝓤
                                    → Semidecidable-Closed-Under-Implications
                                       𝓤 𝓤₀
                                    → LPO' 𝓤
LPO-from-semidecidable-implications mp h =
 LPO-from-semidecidable-negations mp (λ X σ → h X 𝟘 σ 𝟘-is-semidecidable)

\end{code}

 (3) Closure under all meets

 For meets the situation is asymetric. We only managed to prove that if we have
 all meets, then we can deduce LPO; and if we have BKS⁺, then we have all meets.

\begin{code}

Semidecidable-All-Meets : (𝓤 𝓥 : Universe) → (𝓤 ⊔ 𝓥) ⁺ ̇
Semidecidable-All-Meets 𝓤 𝓥 = (X : 𝓤 ̇ ) (Y : X → 𝓥 ̇ )
                            → ((x : X) → is-semidecidable (Y x))
                            → is-semidecidable (Π Y)

all-meets-implies-negations : Semidecidable-All-Meets 𝓤 𝓤₀
                            → Semidecidable-Closed-Under-Negations 𝓤
all-meets-implies-negations h X _ = h X (λ _ → 𝟘) (λ _ → 𝟘-is-semidecidable)

all-meets-implies-LPO : Semidecidable-All-Meets 𝓤 𝓤₀ → MP' 𝓤 → LPO' 𝓤
all-meets-implies-LPO h mp =
 LPO-from-semidecidable-negations mp (all-meets-implies-negations h)

BKS⁺-implies-all-meets : BKS⁺ (𝓤 ⊔ 𝓥)
                       → Semidecidable-All-Meets 𝓤 𝓥
BKS⁺-implies-all-meets bks X Y σ =
 bks (Π Y) (Π-is-prop fe (λ x → prop-if-semidecidable (σ x)))

\end{code}

 (4) Closure under all joins

 For joins the situation is nicely symmetric again (modulo universe
 parameters): we have closure under all joins if and only if BKS⁺ holds.

\begin{code}

Semidecidable-All-Joins : (𝓤 𝓥 : Universe) → (𝓤 ⊔ 𝓥) ⁺ ̇
Semidecidable-All-Joins 𝓤 𝓥 = (X : 𝓤 ̇ ) (Y : X → 𝓥 ̇ )
                            → ((x : X) → is-semidecidable (Y x))
                            → is-semidecidable (∃ Y)

BKS⁺-implies-all-joins : BKS⁺ (𝓤 ⊔ 𝓥)
                       → Semidecidable-All-Joins 𝓤 𝓥
BKS⁺-implies-all-joins bks X Y σ = bks (∃ Y) ∥∥-is-prop

\end{code}

In fact, for the reverse implication, closure under subsingleton joins suffices.

\begin{code}

Semidecidable-Subsingleton-Joins : (𝓤 𝓥 : Universe) → (𝓤 ⊔ 𝓥) ⁺ ̇
Semidecidable-Subsingleton-Joins 𝓤 𝓥 = (X : 𝓤 ̇ ) (Y : X → 𝓥 ̇ ) → is-prop X
                                     → ((x : X) → is-semidecidable (Y x))
                                     → is-semidecidable (∃ Y)

subsingleton-joins-implies-BKS⁺ : Semidecidable-Subsingleton-Joins 𝓤 𝓤₀
                                → BKS⁺ 𝓤
subsingleton-joins-implies-BKS⁺ σ X X-is-prop =
 is-semidecidable-cong γ (σ X (λ _ → 𝟙) X-is-prop (λ _ → 𝟙-is-semidecidable))
  where
   γ : ∥ X × 𝟙 ∥ ≃ X
   γ = ∥ X × 𝟙 ∥ ≃⟨ ∥∥-cong pt 𝟙-rneutral ⟩
       ∥ X ∥     ≃⟨ prop-is-equivalent-to-its-truncation X-is-prop ⟩
       X         ■

all-joins-implies-BKS⁺ : Semidecidable-All-Joins 𝓤 𝓤₀
                       → BKS⁺ 𝓤
all-joins-implies-BKS⁺ j =
 subsingleton-joins-implies-BKS⁺ (λ X Y X-is-prop σ → j X Y σ)

\end{code}

Part IV: Escardo Knapp Choice, the dominance axiom and closure under Σ

We start by formulating:
∗ that the semidecidable types are closed under Σ;
∗ Rosolini's dominance axiom of dependent closure under ×;

and prove their equivalence following [End of Section 2.5, EKC2017].

\end{code}

\begin{code}

Semidecidable-Closed-Under-Σ : (𝓤 𝓥 : Universe) → (𝓤 ⊔ 𝓥) ⁺ ̇
Semidecidable-Closed-Under-Σ 𝓤 𝓥 = (P : 𝓤 ̇ )
                                 → is-semidecidable P
                                 → (Q : P → 𝓥 ̇ )
                                 → ((p : P) → is-semidecidable (Q p))
                                 → is-semidecidable (Σ Q)

Semidecidable-Dominance-Axiom : (𝓤 𝓥 : Universe) → (𝓤 ⊔ 𝓥) ⁺ ̇
Semidecidable-Dominance-Axiom 𝓤 𝓥 = (P : 𝓤 ̇ )
                                  → is-semidecidable P
                                  → (Q : 𝓥 ̇ )
                                  → (P → is-semidecidable Q)
                                  → is-semidecidable (P × Q)

\end{code}

That the dominance axiom implies closure in Σ is proved next.

There is a very similar result and proof in Dominance.lagda (see
D3-and-D5'-give-D5), but we can't use it here, because we have more general
universe parameters (i.e. P : 𝓤, but Q : P → 𝓥) which are not possible in
Dominance.lagda as the dominance is given by a function d : 𝓣 → 𝓚 whose domain
is a *fixed* universe 𝓣.

\begin{code}

closure-under-Σ-if-dominance-axiom : Semidecidable-Dominance-Axiom 𝓤 (𝓤 ⊔ 𝓥)
                                   → Semidecidable-Closed-Under-Σ 𝓤 𝓥
closure-under-Σ-if-dominance-axiom {𝓤} {𝓥} D P ρ Q σ = τ
 where
  i : is-prop P
  i = prop-if-semidecidable ρ
  j : (p : P) → is-prop (Q p)
  j p = prop-if-semidecidable (σ p)
  Q' : 𝓤 ⊔ 𝓥 ̇
  Q' = Σ Q
  k : is-prop Q'
  k = Σ-is-prop i j
  e : (p : P) → Q' ≃ Q p
  e p = logically-equivalent-props-are-equivalent k (j p)
         (λ (p' , q) → transport Q (i p' p) q)
         (λ q → p , q)
  τ : is-semidecidable (Σ Q)
  τ = is-semidecidable-cong (Σ-cong e) (D P ρ Q' τ')
   where
    τ' : P → is-semidecidable Q'
    τ' p = is-semidecidable-cong (≃-sym (e p)) (σ p)

dominance-axiom-if-closure-under-Σ : Semidecidable-Closed-Under-Σ 𝓤 𝓥
                                   → Semidecidable-Dominance-Axiom 𝓤 𝓥
dominance-axiom-if-closure-under-Σ scus P ρ Q σ = scus P ρ (λ _ → Q) σ

\end{code}

Next, we introduce the choice principle from [EK2017] - we call it Escardo Knapp
Choice (EKC) - and formalize [Theorem 3, EK2017] which says that the
semidecidable types are closed under Σ if and only if Escardo Knapp Choice holds.

\begin{code}

Escardo-Knapp-Choice : (𝓤 𝓥 : Universe) → (𝓤 ⊔ 𝓥) ⁺ ̇
Escardo-Knapp-Choice 𝓤 𝓥 = (P : 𝓤 ̇ ) (Q : 𝓥 ̇ )
                         → is-semidecidable P
                         → (P → is-semidecidable Q)
                         → ∥ (P → semidecidability-structure Q) ∥

semidecidable-closed-under-Σ-implies-EKC : Semidecidable-Closed-Under-Σ 𝓤 𝓥
                                         → Escardo-Knapp-Choice 𝓤 𝓥
semidecidable-closed-under-Σ-implies-EKC H P Q ρ σ = ∥∥-functor g τ
 where
  τ : is-semidecidable (P × Q)
  τ = H P ρ (λ _ → Q) σ
  f : P → (P × Q) ≃ Q
  f p = logically-equivalent-props-are-equivalent
         (×-is-prop (prop-if-semidecidable ρ) Q-is-prop) Q-is-prop
          pr₂ (λ q → p , q)
   where
    Q-is-prop : is-prop Q
    Q-is-prop = prop-if-semidecidable (σ p)
  g : semidecidability-structure (P × Q) → (P → semidecidability-structure Q)
  g ss p = semidecidability-structure-cong (f p) ss

\end{code}

The converse holds too, albeit with a longer proof.

(In the paper, some of the verifications - most importantly, the proof τ below -
are left to the reader, presumably because they are straightforward yet tedious.)

\begin{code}

EKC-implies-semidecidable-closed-under-Σ : Escardo-Knapp-Choice 𝓤 (𝓤 ⊔ 𝓥)
                                         → Semidecidable-Closed-Under-Σ 𝓤 𝓥
EKC-implies-semidecidable-closed-under-Σ {𝓤} {𝓥} ekc =
 closure-under-Σ-if-dominance-axiom γ
  where
   γ : Semidecidable-Dominance-Axiom 𝓤 (𝓤 ⊔ 𝓥)
   γ P ρ Q σ = ∥∥-rec being-semidecidable-is-prop r ρ
    where
     r : semidecidability-structure P → is-semidecidable (P × Q)
     r (α , e) = ∥∥-functor s (ekc P Q ρ σ)
      where
       to-P : (∃ n ꞉ ℕ , α n ＝ ₁) → P
       to-P = ⌜ e ⌝⁻¹
       s : (P → semidecidability-structure Q)
         → semidecidability-structure (P × Q)
       s σ⁺ = ⌜ semidecidability-pairing-lemma ⌝ τ
        where
         β : P → (ℕ → 𝟚)
         β p = pr₁ (σ⁺ p)
         φ : ℕ × ℕ → 𝓤₀ ̇
         φ (n , m) = Σ b ꞉ α n ＝ ₁ , β (to-P ∣ n , b ∣) m ＝ ₁
         φ-is-complemented : is-complemented φ
         φ-is-complemented (n , m) =
          decidable-closed-under-Σ 𝟚-is-set (𝟚-is-discrete (α n) ₁)
                                   (λ b → 𝟚-is-discrete (β (to-P ∣ n , b ∣) m) ₁)
         φ-is-prop-valued : (k : ℕ × ℕ) → is-prop (φ k)
         φ-is-prop-valued k = Σ-is-prop 𝟚-is-set (λ b → 𝟚-is-set)
         φ⁺ : ℕ × ℕ → Ω 𝓤₀
         φ⁺ k = φ k , φ-is-prop-valued k

         τ : Σ Ψ ꞉ (ℕ → ℕ → 𝟚) , P × Q ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ ,  Ψ n m ＝ ₁)
         τ = ⌜ uncurry-lemma ⌝ τ'
          where
           uncurry-lemma :
              (Σ Ψ ꞉ (ℕ × ℕ → 𝟚) , P × Q ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ ,  Ψ (n , m) ＝ ₁))
            ≃ (Σ Ψ ꞉ (ℕ → ℕ → 𝟚) , P × Q ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ ,  Ψ n m ＝ ₁))
           uncurry-lemma = ≃-sym
                            (Σ-change-of-variable _ ⌜ μ ⌝⁻¹ (⌜⌝⁻¹-is-equiv μ))
            where
             μ : (ℕ × ℕ → 𝟚) ≃ (ℕ → ℕ → 𝟚)
             μ = curry-uncurry fe'

           τ' : (Σ Ψ ꞉ (ℕ × ℕ → 𝟚) , P × Q ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ (n , m) ＝ ₁))
           τ' = Ψ , (P × Q                              ≃⟨ I  ⟩
                    (∃ n ꞉ ℕ , Σ m ꞉ ℕ , φ (n , m))     ≃⟨ II ⟩
                    (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ (n , m) ＝ ₁) ■)
            where
             χ : (Σ A ꞉ (ℕ × ℕ → Ω 𝓤₀) , is-complemented-subset A) → (ℕ × ℕ → 𝟚)
             χ = ⌜ 𝟚-classifies-decidable-subsets fe fe pe ⌝⁻¹
             Ψ : ℕ × ℕ → 𝟚
             Ψ = χ (φ⁺ , φ-is-complemented)

             II = ∥∥-cong pt
                   (Σ-cong (λ n →
                     Σ-cong (λ m → logically-equivalent-props-are-equivalent
                                    (φ-is-prop-valued (n , m))
                                    𝟚-is-set
                                    (rl-implication (lemma n m))
                                    (lr-implication (lemma n m)))))
              where
               lemma : (n m : ℕ)
                     → χ (φ⁺ , φ-is-complemented) (n , m) ＝ ₁ ↔ (n , m) ∈ φ⁺
               lemma n m = pr₂ (𝟚-classifies-decidable-subsets-values fe fe pe
                                 φ⁺ φ-is-complemented (n , m))
             I  = logically-equivalent-props-are-equivalent j ∥∥-is-prop f g
              where
               j : is-prop (P × Q)
               j = prop-criterion
                    (λ (p , q) → ×-is-prop (prop-if-semidecidable ρ)
                                           (prop-if-semidecidable (σ p)))
               e' : (p : P) → Q ≃ (∃ m ꞉ ℕ , β p m ＝ ₁)
               e' p = pr₂ (σ⁺ p)
               g : (∃ n ꞉ ℕ , Σ m ꞉ ℕ , φ (n , m)) → P × Q
               g = ∥∥-rec j g'
                where
                 g' : (Σ n ꞉ ℕ , Σ m ꞉ ℕ , φ (n , m)) → P × Q
                 g' (n , m , b , b') = p , ⌜ e' p ⌝⁻¹ ∣ m , b' ∣
                  where
                   p : P
                   p = to-P ∣ n , b ∣
               f : P × Q → ∃ n ꞉ ℕ , Σ m ꞉ ℕ , φ (n , m)
               f (p , q) = ∥∥-rec ∥∥-is-prop f' (⌜ e ⌝ p)
                where
                 f' : (Σ n ꞉ ℕ , α n ＝ ₁)
                    → ∃ n ꞉ ℕ , Σ m ꞉ ℕ , φ (n , m)
                 f' (n , b) = ∥∥-functor f'' (⌜ e' p' ⌝ q)
                  where
                   p' : P
                   p' = to-P ∣ n , b ∣
                   f'' : (Σ m ꞉ ℕ , β p' m ＝ ₁)
                       → Σ n ꞉ ℕ , Σ m ꞉ ℕ , φ (n , m)
                   f'' (m , b') = n , m , b , b'

\end{code}

Part V: (Subsingleton) Countable choice and closure under (subsingleton)
        countable joins

We investigate the connections between
(1) closure of semidecidable propositions under (particular kinds of) countable joins
and
(2) instances of countable choice.

Our findings are summarized at the end in a diagram of implications.


We start by proving that if we have a countable family Xₙ and each Xₙ has
semidecidability structure, then so does ∃ X.

The situation where Xₙ is only known to be semidecidable is rather different in
the absence of countable choice.

\begin{code}

∃-has-semidecidability-structure : (X : ℕ → 𝓤 ̇ )
                                 → (Π n ꞉ ℕ , semidecidability-structure (X n))
                                 → semidecidability-structure (∃ X)
∃-has-semidecidability-structure X σ = ⌜ semidecidability-pairing-lemma ⌝ γ
 where
  γ : Σ Ψ ꞉ (ℕ → ℕ → 𝟚) , ∃ X ≃ (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ n m ＝ ₁)
  γ = Ψ , e
   where
    lemma : (Π n ꞉ ℕ , semidecidability-structure (X n))
          → (Σ Ψ ꞉ (ℕ → ℕ → 𝟚) , Π n ꞉ ℕ , X n ≃ (∃ m ꞉ ℕ , Ψ n m ＝ ₁))
    lemma = ⌜ ΠΣ-distr-≃ ⌝
    Ψ : ℕ → ℕ → 𝟚
    Ψ = pr₁ (lemma σ)
    e = ∃ X                             ≃⟨ ∃-cong pt (pr₂ (lemma σ)) ⟩
        (∃ n ꞉ ℕ , ∃ m ꞉ ℕ , Ψ n m ＝ ₁) ≃⟨ outer-∃-inner-Σ pt        ⟩
        (∃ n ꞉ ℕ , Σ m ꞉ ℕ , Ψ n m ＝ ₁) ■

\end{code}

Next, we consider a particular instance of countable choice that we dub
Countable Semidecidable Choice (CSC) here and prove that it suffices to show
that the semidecidable propositions are closed under countable choice.

\begin{code}

Countable-Semidecidable-Choice : (𝓤 : Universe) → 𝓤 ⁺ ̇
Countable-Semidecidable-Choice 𝓤 =
   (X : ℕ → 𝓤 ̇ )
 → (Π n ꞉ ℕ , ∥ semidecidability-structure (X n) ∥)
 → ∥ Π n ꞉ ℕ , semidecidability-structure (X n) ∥

Semidecidable-Closed-Under-Countable-Joins : (𝓤 : Universe) → 𝓤 ⁺ ̇
Semidecidable-Closed-Under-Countable-Joins 𝓤 =
 (X : ℕ → 𝓤 ̇ ) → (Π n ꞉ ℕ , is-semidecidable (X n)) → is-semidecidable (∃ X)

CSC-implies-semidecidable-closed-under-countable-joins :
   Countable-Semidecidable-Choice 𝓤
 → Semidecidable-Closed-Under-Countable-Joins 𝓤
CSC-implies-semidecidable-closed-under-countable-joins {𝓤} csc X σ =
 ∥∥-functor (∃-has-semidecidability-structure X) (csc X σ)

\end{code}

We were not able to prove that the above implication can be reversed, i.e. that
CSC is necessary for the semidecidable propositions to be closed under countable
joins.


However, for a particular kind of families Xₙ we can find another (weak)
instance of countable choice and prove it equivalent to closure under these
particular kind of families.

The condition on the families Xₙ is that they are such that Σ X is a
proposition. In other words, there exists at most one n : ℕ such that Xₙ holds.

The closure condition is formulated precisely below as the weak choice principle
which we call Subsingleton Countable Semidecidable Choice (SCSC).

\begin{code}

Semidecidable-Closed-Under-Subsingleton-Countable-Joins : (𝓤 : Universe) → 𝓤 ⁺ ̇
Semidecidable-Closed-Under-Subsingleton-Countable-Joins 𝓤 =
   (X : ℕ → 𝓤 ̇ )
 → is-prop (Σ X)
 → (Π n ꞉ ℕ , is-semidecidable (X n))
 → is-semidecidable (Σ X)

Subsingleton-Countable-Semidecidable-Choice : (𝓤 : Universe) → 𝓤 ⁺ ̇
Subsingleton-Countable-Semidecidable-Choice 𝓤 =
   (X : ℕ → 𝓤 ̇ )
 → is-prop (Σ X)
 → (Π n ꞉ ℕ , ∥ semidecidability-structure (X n) ∥)
 → ∥ Π n ꞉ ℕ , semidecidability-structure (X n) ∥

SCSC-implies-semidecidable-closed-under-subsingleton-countable-joins :
   Subsingleton-Countable-Semidecidable-Choice 𝓤
 → Semidecidable-Closed-Under-Subsingleton-Countable-Joins 𝓤
SCSC-implies-semidecidable-closed-under-subsingleton-countable-joins
 scsc X ΣX-is-prop X-semidec = ∥∥-functor γ (scsc X ΣX-is-prop X-semidec)
  where
   γ : ((n : ℕ) → semidecidability-structure (X n))
     → semidecidability-structure (Σ X)
   γ σ = semidecidability-structure-cong
          e (∃-has-semidecidability-structure X σ)
    where
     e : ∃ X ≃ Σ X
     e = prop-is-equivalent-to-its-truncation ΣX-is-prop

\end{code}

The point of introducing the above choice principle and closure condition is
that we can prove the converse, formulated below:

\begin{code}

SCSC-if-semidecidable-closed-under-subsingleton-countable-joins :
   Semidecidable-Closed-Under-Subsingleton-Countable-Joins 𝓤
 → Subsingleton-Countable-Semidecidable-Choice 𝓤

\end{code}

The proof of the converse is somewhat involved and relies on the following
lemma, which looks like it reverses ∃-has-semidecidability-structure although we
assume semidecidability structure on Σ X rather than ∃ X here.

\begin{code}

semidecidability-structure-Σ : (X : ℕ → 𝓤 ̇ )
                             → (Π n ꞉ ℕ , is-prop (X n))
                             → semidecidability-structure (Σ X)
                             → (Π n ꞉ ℕ , semidecidability-structure (X n))

\end{code}

Before starting the formalized proof, we explain the proof strategy here.

(1) By assumption, we start with Ψ : ℕ → 𝟚 such that
      (Σ X) ≃ (∃ m ꞉ ℕ , Ψ m ＝ ₁).

(2) Using Ψ and the equivalence above, we construct P : ℕ → ℕ → 𝓤 such that for
    every n : ℕ we have
      (X n) ≃ (∃ k ꞉ ℕ , P n k), witnessed by f, say.

    Explicitly, P is given by
       P n m = (Σ p ꞉ (Ψ m ＝ ₁) , pr₁ (f ∣ m , p ∣) ＝ n).

(3) We prove that each P n is complemented and subsingleton-valued, i.e. that each
    P n is a decidable subset of ℕ.

This equips every X n with semidecidability structure.


In developing the proof, we found it easier to consider the more general setting
where we replace ℕ by any type X, the family X : ℕ → 𝓤 by a family Y : X → 𝓥 and
the predicate Ψ by a family A : X → 𝓦. The following "key-construction" and
lemma are steps (1) and (2) in the more general setting.

\begin{code}

private

 key-construction : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : X → 𝓦 ̇ }
                  → (∃ A → Σ Y)
                  → X → X → 𝓤 ⊔ 𝓦 ̇
 key-construction {𝓤} {𝓥} {𝓦} {X} {Y} {A} f x y =
   Σ a ꞉ A y , pr₁ (f ∣ y , a ∣) ＝ x

 key-construction-lemma : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : X → 𝓦 ̇ }
                        → ((x : X) → is-prop (Y x))
                        → (f : ∃ A ≃ Σ Y)
                        → (x : X) → Y x ≃ ∃ (key-construction ⌜ f ⌝ x)
 key-construction-lemma {𝓤} {𝓥} {𝓦} {X} {Y} {A} i f x =
  logically-equivalent-props-are-equivalent (i x) ∥∥-is-prop α β
   where
    β : ∃ (key-construction ⌜ f ⌝ x) → Y x
    β = ∥∥-rec (i x) γ
     where
      γ : Σ (key-construction ⌜ f ⌝ x) → Y x
      γ (y , a , e) = transport Y e (pr₂ (⌜ f ⌝ ∣ y , a ∣))
    α : Y x → ∃ (key-construction ⌜ f ⌝ x)
    α y = ∥∥-functor γ (⌜ f ⌝⁻¹ (x , y))
     where
      γ : Σ A → Σ (key-construction ⌜ f ⌝ x)
      γ (x' , a) = x' , (a , ap pr₁ e)
       where
        e = ⌜ f ⌝ ∣ x' , a ∣        ＝⟨ I  ⟩
            ⌜ f ⌝ (⌜ f ⌝⁻¹ (x , y)) ＝⟨ II ⟩
            (x , y)                 ∎
         where
          I  = ap ⌜ f ⌝ (∥∥-is-prop ∣ x' , a ∣ (⌜ f ⌝⁻¹ (x , y)))
          II = ≃-sym-is-rinv f (x , y)

\end{code}

Now, only step (3) remains and this is straightforward.

\begin{code}

semidecidability-structure-Σ  = γ
 where
  γ : (X : ℕ → 𝓤 ̇ )
    → (Π n ꞉ ℕ , is-prop (X n))
    → semidecidability-structure (Σ X)
    → (Π n ꞉ ℕ , semidecidability-structure (X n))
  γ X X-is-prop-valued (Ψ , e) n = ⌜ semidecidability-structure-≃ ⌝⁻¹ σ
   where
    σ : semidecidability-structure' 𝓤₀ (X n)
    σ = φ⁺ , φ-is-complemented ,
        (key-construction-lemma X-is-prop-valued (≃-sym e) n)
     where
      φ : ℕ → 𝓤₀ ̇
      φ = key-construction {𝓤₀} {_} {𝓤₀} {ℕ} {X} {λ m → Ψ m ＝ ₁} ⌜ e ⌝⁻¹ n
      φ-is-complemented : is-complemented φ
      φ-is-complemented m = decidable-closed-under-Σ 𝟚-is-set
                           (𝟚-is-discrete (Ψ m) ₁)
                           (λ (p : Ψ m ＝ ₁) → ℕ-is-discrete
                                               (pr₁ (⌜ e ⌝⁻¹ ∣ m , p ∣)) n)
      φ⁺ : ℕ → Ω 𝓤₀
      φ⁺ n = (φ n , φ-is-prop-valued n)
       where
        φ-is-prop-valued : (m : ℕ) → is-prop (φ m)
        φ-is-prop-valued m = Σ-is-prop 𝟚-is-set (λ _ → ℕ-is-set)


\end{code}

Finally, we prove, using semidecidability-structure-Σ, the desired converse:
i.e. that SCSC implies that the semidecidable propositions are closed under
subsingleton countable joins.

\begin{code}

SCSC-if-semidecidable-closed-under-subsingleton-countable-joins = γ
 where
  γ : Semidecidable-Closed-Under-Subsingleton-Countable-Joins 𝓤
    → Subsingleton-Countable-Semidecidable-Choice 𝓤
  γ h X i σ = ∥∥-functor (semidecidability-structure-Σ X j) (h X i σ)
   where
    j : (n : ℕ) → is-prop (X n)
    j n = prop-if-semidecidable (σ n)

\end{code}

Martín Escardó observed that for the semidecidable propositions closure under
subsingleton countable joins implies closure under Σ.

Hence, the choice principle SCSC implies the choice principle EKC.

Before formalizing Martín's observation, we prove a lemma that, given a
decidable subset A ⊆ ℕ allows us to find a decidable subset B ⊆ ℕ such that B
contains a single element precisely when A is inhabited. This is done by finding
the least such n ∈ A, if A happens to be inhabited.

\begin{code}

subset-with-only-the-least-witness : (A : ℕ → Ω 𝓤)
                                   → is-complemented-subset A
                                   → Σ B ꞉ (ℕ → Ω 𝓤) , is-complemented-subset B
                                                     × ((∃ n ꞉ ℕ , n ∈ A)
                                                     ≃ (Σ n ꞉ ℕ , n ∈ B))
subset-with-only-the-least-witness {𝓤} A A-is-decidable = B , B-is-decidable , γ
 where
  B : ℕ → Ω 𝓤
  B n = (n ∈ A × is-empty (Σ r ꞉ Fin' n , pr₁ r ∈ A))
      , (×-is-prop (∈-is-prop A n) (negations-are-props fe))
  B-is-decidable : is-complemented-subset B
  B-is-decidable n = ×-preserves-decidability (A-is-decidable n)
                                              (¬-preserves-decidability σ)
   where
    σ : is-decidable (Σ r ꞉ Fin' n , pr₁ r ∈ A)
    σ = Compact-closed-under-≃ (≃-Fin n) Fin-Compact (pr₁ ∘ A ∘ pr₁)
         (λ r → A-is-decidable (pr₁ r))
  ΣB-is-prop : is-prop (Σ n ꞉ ℕ , n ∈ B)
  ΣB-is-prop (n , a , min) (n' , a' , min') =
   to-subtype-＝ (∈-is-prop B) (κ (<-trichotomous n n'))
    where
     κ : (n < n') + (n ＝ n') + (n' < n)
       → n ＝ n'
     κ (inl k)       = 𝟘-elim (min' ((n , k) , a))
     κ (inr (inl e)) = e
     κ (inr (inr l)) = 𝟘-elim (min ((n' , l) , a'))
  γ : (∃ n ꞉ ℕ , n ∈ A) ≃ (Σ n ꞉ ℕ , n ∈ B)
  γ = logically-equivalent-props-are-equivalent ∥∥-is-prop ΣB-is-prop f g
   where
    g : (Σ n ꞉ ℕ , n ∈ B) → (∃ n ꞉ ℕ , n ∈ A)
    g (n , a , _) = ∣ n , a ∣
    f : (∃ n ꞉ ℕ , n ∈ A) → (Σ n ꞉ ℕ , n ∈ B)
    f = ∥∥-rec ΣB-is-prop h
     where
      h : (Σ n ꞉ ℕ , n ∈ A) → (Σ n ꞉ ℕ , n ∈ B)
      h (n , a) = k , a' , ν
       where
        u : Σμ (λ m → m ∈ A)
        u = least-from-given (λ m → m ∈ A) A-is-decidable (n , a)
        k : ℕ
        k = pr₁ u
        a' : k ∈ A
        a' = pr₁ (pr₂ u)
        min : (m : ℕ) → m ∈ A → k ≤ m
        min = pr₂ (pr₂ u)
        ν : is-empty (Σ r ꞉ Fin' k , pr₁ r ∈ A)
        ν ((m , l) , aₘ) = less-not-bigger-or-equal m k l (min m aₘ)

\end{code}

We now use the above lemma to prove Martín's observation, from which it follows
that SCSC implies EKC.

We briefly sketch the proof of the observation.

(1) Assume P : 𝓤 is semidecidable and Q : P → 𝓥.
    We are to show that Σ Q is semidecidable.

(2) Find α : ℕ → 𝟚 witnesses the semidecidability of P.

(3) Construct a decidable subset P̃ ⊆ ℕ such that P̃ contains the least n for
    which α n ＝ ₁, if it exists. Then, Σ P̃ ≃ P by (2).

(4) Construct Q̃ ⊆ ℕ as {n ∈ ℕ | n ∈ P̃ and Q pₙ}, where pₙ is constructed
    using n ∈ P̃ and the equivalence between Σ P̃ and P.

(5) Note that Σ Q̃ is a subsingleton, because P̃ contains at most one element.
    Now prove that Σ Q̃ ≃ Σ Q.

(6) Show that Σ Q̃ is semidecidable using the assumption that semidecidable types
    are closed under subsingleton countable joins:
    ∗ recall that Σ Q̃ is a subsingleton;
    ∗ hence, it suffices to prove that each Q̃ n is semidecidable, which is
      straightforward using decidability of P̃.

(7) From (5) and (6), it follows that Σ Q is semidecidable, as desired.

\begin{code}

closure-under-Σ-if-closure-under-subsingleton-countable-joins :
   Semidecidable-Closed-Under-Subsingleton-Countable-Joins 𝓤
 → Semidecidable-Closed-Under-Σ 𝓥 𝓤
closure-under-Σ-if-closure-under-subsingleton-countable-joins {𝓤} H P ρ Q σ =
 ∥∥-rec being-semidecidable-is-prop γ ρ
  where
   γ : semidecidability-structure P
     → is-semidecidable (Σ Q)
   γ (α , e) = is-semidecidable-cong ΣQ̃-ΣQ-equiv ΣQ̃-is-semidecidable
    where
     Q-is-prop-valued : (p : P) → is-prop (Q p)
     Q-is-prop-valued p = prop-if-semidecidable (σ p)

     W : Σ B ꞉ (ℕ → Ω 𝓤₀) , is-complemented-subset B
                          × ((∃ n ꞉ ℕ , α n ＝ ₁) ≃ (Σ n ꞉ ℕ , n ∈ B))
     W = subset-with-only-the-least-witness
          (λ n → (α n ＝ ₁) , 𝟚-is-set) (λ n → 𝟚-is-discrete (α n) ₁)

     P̃ : ℕ → Ω 𝓤₀
     P̃ = pr₁ W
     P̃-is-decidable : is-complemented-subset P̃
     P̃-is-decidable = pr₁ (pr₂ W)
     ΣP̃-equiv : (∃ n ꞉ ℕ , α n ＝ ₁) ≃ (Σ n ꞉ ℕ , n ∈ P̃)
     ΣP̃-equiv = pr₂ (pr₂ W)
     ΣP̃-to-P : (Σ n ꞉ ℕ , n ∈ P̃) → P
     ΣP̃-to-P = ⌜ e ⌝⁻¹ ∘ ⌜ ΣP̃-equiv ⌝⁻¹

     Q̃ : ℕ → 𝓤 ̇
     Q̃ n = Σ q ꞉ n ∈ P̃ , Q (ΣP̃-to-P (n , q))
     Q̃-is-prop-valued : (n : ℕ) → is-prop (Q̃ n)
     Q̃-is-prop-valued n = Σ-is-prop (∈-is-prop P̃ n)
                            (λ q₁ → Q-is-prop-valued (ΣP̃-to-P (n , q₁)))

     ΣQ̃-is-prop : is-prop (Σ Q̃)
     ΣQ̃-is-prop (n , q₁ , q) (n' , q₁' , q') =
      to-subtype-＝ Q̃-is-prop-valued
                   (ap pr₁ (equiv-to-prop (≃-sym ΣP̃-equiv) ∥∥-is-prop
                             (n , q₁) (n' , q₁')))
     ΣQ̃-ΣQ-equiv : Σ Q̃ ≃ Σ Q
     ΣQ̃-ΣQ-equiv = logically-equivalent-props-are-equivalent ΣQ̃-is-prop
                     (Σ-is-prop (prop-if-semidecidable ρ)
                     (λ p → prop-if-semidecidable (σ p)))
                     f g
      where
       f : Σ Q̃ → Σ Q
       f (n , q₁ , q) = (ΣP̃-to-P (n , q₁) , q)
       g : Σ Q → Σ Q̃
       g (p , q) = (n , q₁ , transport Q (prop-if-semidecidable ρ p p') q)
        where
         n : ℕ
         n = pr₁ (⌜ ΣP̃-equiv ⌝ (⌜ e ⌝ p))
         q₁ : n ∈ P̃
         q₁ = pr₂ (⌜ ΣP̃-equiv ⌝ (⌜ e ⌝ p))
         p' : P
         p' = ΣP̃-to-P (n , q₁)

     ΣQ̃-is-semidecidable : is-semidecidable (Σ Q̃)
     ΣQ̃-is-semidecidable = H Q̃ ΣQ̃-is-prop τ
      where
       τ : (n : ℕ) → is-semidecidable (Q̃ n)
       τ n = κ (P̃-is-decidable n)
        where
         κ : is-decidable (n ∈ P̃) → is-semidecidable (Q̃ n)
         κ (inl  q₁) = is-semidecidable-cong claim (σ p)
          where
           p : P
           p = ΣP̃-to-P (n , q₁)
           claim : Q p ≃ Q̃ n
           claim = logically-equivalent-props-are-equivalent
                    (Q-is-prop-valued p) (Q̃-is-prop-valued n)
                    ϕ ψ
            where
             ϕ : Q p → Q̃ n
             ϕ q = q₁ , q
             ψ : Q̃ n → Q p
             ψ (q₁ , q) =
              transport Q (prop-if-semidecidable ρ (ΣP̃-to-P (n , q₁)) p) q
         κ (inr nq₁) = empty-types-are-semidecidable claim
          where
           claim : is-empty (Q̃ n)
           claim (q₁ , q) = nq₁ q₁

SCSC-implies-EKC :
   Semidecidable-Closed-Under-Subsingleton-Countable-Joins 𝓤
 → Escardo-Knapp-Choice 𝓥 𝓤
SCSC-implies-EKC = semidecidable-closed-under-Σ-implies-EKC
                 ∘ closure-under-Σ-if-closure-under-subsingleton-countable-joins

\end{code}

Summary of the above implications between choice principles and closure
conditions:

Recall that
∗  CSC =              Countable Semidecidable Choice
∗ SCSS = Subsingleton Countable Semidecidable Choice
∗  EKC = Escardo Knapp Choice


        EKC ⟵⟶ Rosolini's Dominance Axiom
         ↑  ⟵⟶ Semidecidable closed under Σ
         ∣                ↑
         ∣                ∣
         ∣                ∣
         ∣                ∣
       SCSC ⟵⟶ Semidecidable closed under
         ↑     subsingleton countable joins
         ∣                ↑
         ∣                ∣
         ∣                ∣
         ∣                ∣
        CSC  ⟶ Semidecidable closed under
                            countable joins


The conjecture is that semidecidable propositions are closed under countable
joins if and only if some form of countable choice holds. But it is not clear
what form this is.

Note that in the above diagram of implications, we only have
  CSC ⟶ (Semidecidable closed under countable joins).

However, for subsingleton countable joins we could get an if and only if with
SCSC, so we do have (Semidecidable closed under countable joins) ⟶ SCSC, which
shows that having closure under countable joins does imply some weak countable
choice principle.



Finally, two closing remarks regarding BSK⁺, SCSC and Escardo Knapp Choice.

\begin{code}

BKS⁺-implies-SCSC : BKS⁺ 𝓤
                  → Subsingleton-Countable-Semidecidable-Choice 𝓤
BKS⁺-implies-SCSC {𝓤} bks =
 SCSC-if-semidecidable-closed-under-subsingleton-countable-joins γ
  where
   γ : Semidecidable-Closed-Under-Subsingleton-Countable-Joins 𝓤
   γ X i σ = bks (Σ X) i

\end{code}

Hence, BKS⁺ implies Escardo Knapp Choice. But we can also easily give a direct
proof of this fact.

\begin{code}

BKS⁺-implies-EKC : BKS⁺ (𝓤 ⊔ 𝓥) → Escardo-Knapp-Choice 𝓤 𝓥
BKS⁺-implies-EKC bks = semidecidable-closed-under-Σ-implies-EKC
                        (λ P σ Q τ → bks (Σ Q)
                        (Σ-is-prop (prop-if-semidecidable σ)
                                   (λ p → prop-if-semidecidable (τ p))))

\end{code}
