# Decidable subtypes ```agda module foundation.decidable-subtypes where ``` <details><summary>Imports</summary> ```agda open import foundation.1-types open import foundation.coproduct-types open import foundation.decidable-propositions open import foundation.decidable-types open import foundation.dependent-pair-types open import foundation.equality-dependent-function-types open import foundation.functoriality-dependent-function-types open import foundation.logical-equivalences open import foundation.sets open import foundation.subtypes open import foundation.universe-levels open import foundation-core.embeddings open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.identity-types open import foundation-core.injective-maps open import foundation-core.propositions open import foundation-core.transport-along-identifications open import foundation-core.truncated-types open import foundation-core.truncation-levels ``` </details> ## Idea A decidable subtype of a type consists of a family of decidable propositions over it. ## Definitions ### Decidable subtypes ```agda is-decidable-subtype-Prop : {l1 l2 : Level} {A : UU l1} → subtype l2 A → Prop (l1 ⊔ l2) is-decidable-subtype-Prop {A = A} P = Π-Prop A (λ a → is-decidable-Prop (P a)) is-decidable-subtype : {l1 l2 : Level} {A : UU l1} → subtype l2 A → UU (l1 ⊔ l2) is-decidable-subtype P = type-Prop (is-decidable-subtype-Prop P) is-prop-is-decidable-subtype : {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) → is-prop (is-decidable-subtype P) is-prop-is-decidable-subtype P = is-prop-type-Prop (is-decidable-subtype-Prop P) decidable-subtype : {l1 : Level} (l : Level) (X : UU l1) → UU (l1 ⊔ lsuc l) decidable-subtype l X = X → Decidable-Prop l ``` ### The underlying subtype of a decidable subtype ```agda module _ {l1 l2 : Level} {A : UU l1} (P : decidable-subtype l2 A) where subtype-decidable-subtype : subtype l2 A subtype-decidable-subtype a = prop-Decidable-Prop (P a) is-decidable-decidable-subtype : is-decidable-subtype subtype-decidable-subtype is-decidable-decidable-subtype a = is-decidable-Decidable-Prop (P a) is-in-decidable-subtype : A → UU l2 is-in-decidable-subtype = is-in-subtype subtype-decidable-subtype is-prop-is-in-decidable-subtype : (a : A) → is-prop (is-in-decidable-subtype a) is-prop-is-in-decidable-subtype = is-prop-is-in-subtype subtype-decidable-subtype ``` ### The underlying type of a decidable subtype ```agda module _ {l1 l2 : Level} {A : UU l1} (P : decidable-subtype l2 A) where type-decidable-subtype : UU (l1 ⊔ l2) type-decidable-subtype = type-subtype (subtype-decidable-subtype P) inclusion-decidable-subtype : type-decidable-subtype → A inclusion-decidable-subtype = inclusion-subtype (subtype-decidable-subtype P) is-emb-inclusion-decidable-subtype : is-emb inclusion-decidable-subtype is-emb-inclusion-decidable-subtype = is-emb-inclusion-subtype (subtype-decidable-subtype P) is-injective-inclusion-decidable-subtype : is-injective inclusion-decidable-subtype is-injective-inclusion-decidable-subtype = is-injective-inclusion-subtype (subtype-decidable-subtype P) emb-decidable-subtype : type-decidable-subtype ↪ A emb-decidable-subtype = emb-subtype (subtype-decidable-subtype P) ``` ## Examples ### The decidable subtypes of left and right elements in a coproduct type ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where is-decidable-is-left : (x : A + B) → is-decidable (is-left x) is-decidable-is-left (inl x) = is-decidable-unit is-decidable-is-left (inr x) = is-decidable-empty is-left-Decidable-Prop : A + B → Decidable-Prop lzero pr1 (is-left-Decidable-Prop x) = is-left x pr1 (pr2 (is-left-Decidable-Prop x)) = is-prop-is-left x pr2 (pr2 (is-left-Decidable-Prop x)) = is-decidable-is-left x is-decidable-is-right : (x : A + B) → is-decidable (is-right x) is-decidable-is-right (inl x) = is-decidable-empty is-decidable-is-right (inr x) = is-decidable-unit is-right-Decidable-Prop : A + B → Decidable-Prop lzero pr1 (is-right-Decidable-Prop x) = is-right x pr1 (pr2 (is-right-Decidable-Prop x)) = is-prop-is-right x pr2 (pr2 (is-right-Decidable-Prop x)) = is-decidable-is-right x ``` ## Properties ### Types of decidable subtypes of any universe level are equivalent ```agda module _ {l1 : Level} (X : UU l1) where equiv-universes-decidable-subtype : (l l' : Level) → decidable-subtype l X ≃ decidable-subtype l' X equiv-universes-decidable-subtype l l' = equiv-Π ( λ _ → Decidable-Prop l') ( id-equiv) ( λ _ → equiv-universes-Decidable-Prop l l') iff-universes-decidable-subtype : (l l' : Level) (S : decidable-subtype l X) → ( (x : X) → type-Decidable-Prop (S x) ↔ type-Decidable-Prop ( map-equiv (equiv-universes-decidable-subtype l l') S x)) iff-universes-decidable-subtype l l' S x = tr ( λ P → type-Decidable-Prop (S x) ↔ type-Decidable-Prop P) ( inv ( compute-map-equiv-Π ( λ _ → Decidable-Prop l') ( id-equiv) ( λ _ → equiv-universes-Decidable-Prop l l') ( S) ( x))) ( iff-universes-Decidable-Prop l l' (S x)) ``` ### A decidable subtype of a `k+1`-truncated type is `k+1`-truncated ```agda module _ {l1 l2 : Level} (k : 𝕋) {A : UU l1} (P : decidable-subtype l2 A) where abstract is-trunc-type-decidable-subtype : is-trunc (succ-𝕋 k) A → is-trunc (succ-𝕋 k) (type-decidable-subtype P) is-trunc-type-decidable-subtype = is-trunc-type-subtype k (subtype-decidable-subtype P) module _ {l1 l2 : Level} {A : UU l1} (P : decidable-subtype l2 A) where abstract is-prop-type-decidable-subtype : is-prop A → is-prop (type-decidable-subtype P) is-prop-type-decidable-subtype = is-prop-type-subtype (subtype-decidable-subtype P) abstract is-set-type-decidable-subtype : is-set A → is-set (type-decidable-subtype P) is-set-type-decidable-subtype = is-set-type-subtype (subtype-decidable-subtype P) abstract is-1-type-type-decidable-subtype : is-1-type A → is-1-type (type-decidable-subtype P) is-1-type-type-decidable-subtype = is-1-type-type-subtype (subtype-decidable-subtype P) prop-decidable-subprop : {l1 l2 : Level} (A : Prop l1) (P : decidable-subtype l2 (type-Prop A)) → Prop (l1 ⊔ l2) prop-decidable-subprop A P = prop-subprop A (subtype-decidable-subtype P) set-decidable-subset : {l1 l2 : Level} (A : Set l1) (P : decidable-subtype l2 (type-Set A)) → Set (l1 ⊔ l2) set-decidable-subset A P = set-subset A (subtype-decidable-subtype P) ``` ### The type of decidable subtypes of a type is a set ```agda is-set-decidable-subtype : {l1 l2 : Level} {X : UU l1} → is-set (decidable-subtype l2 X) is-set-decidable-subtype {l1} {l2} {X} = is-set-function-type is-set-Decidable-Prop ``` ### Extensionality of the type of decidable subtypes ```agda module _ {l1 l2 : Level} {A : UU l1} (P : decidable-subtype l2 A) where has-same-elements-decidable-subtype : {l3 : Level} → decidable-subtype l3 A → UU (l1 ⊔ l2 ⊔ l3) has-same-elements-decidable-subtype Q = has-same-elements-subtype ( subtype-decidable-subtype P) ( subtype-decidable-subtype Q) extensionality-decidable-subtype : (Q : decidable-subtype l2 A) → (P = Q) ≃ has-same-elements-decidable-subtype Q extensionality-decidable-subtype = extensionality-Π P ( λ x Q → (type-Decidable-Prop (P x)) ↔ (type-Decidable-Prop Q)) ( λ x Q → extensionality-Decidable-Prop (P x) Q) has-same-elements-eq-decidable-subtype : (Q : decidable-subtype l2 A) → (P = Q) → has-same-elements-decidable-subtype Q has-same-elements-eq-decidable-subtype Q = map-equiv (extensionality-decidable-subtype Q) eq-has-same-elements-decidable-subtype : (Q : decidable-subtype l2 A) → has-same-elements-decidable-subtype Q → P = Q eq-has-same-elements-decidable-subtype Q = map-inv-equiv (extensionality-decidable-subtype Q) refl-extensionality-decidable-subtype : map-equiv (extensionality-decidable-subtype P) refl = (λ x → pair id id) refl-extensionality-decidable-subtype = refl ```