# Full subtypes of types ```agda module foundation.full-subtypes where ``` <details><summary>Imports</summary> ```agda open import foundation.decidable-subtypes open import foundation.dependent-pair-types open import foundation.type-arithmetic-dependent-pair-types open import foundation.unit-type open import foundation.universe-levels open import foundation-core.equivalences open import foundation-core.propositions open import foundation-core.subtypes open import foundation-core.transport-along-identifications ``` </details> ## Idea The full subtype of a type contains every element. We define a full subtype at each universe level. ## Definition ### Full subtypes ```agda module _ {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) where is-full-subtype-Prop : Prop (l1 ⊔ l2) is-full-subtype-Prop = Π-Prop A (λ x → P x) is-full-subtype : UU (l1 ⊔ l2) is-full-subtype = type-Prop is-full-subtype-Prop is-prop-is-full-subtype : is-prop is-full-subtype is-prop-is-full-subtype = is-prop-type-Prop is-full-subtype-Prop ``` ### Full decidable subtypes ```agda is-full-decidable-subtype : {l1 l2 : Level} {A : UU l1} → decidable-subtype l2 A → UU (l1 ⊔ l2) is-full-decidable-subtype P = is-full-subtype (subtype-decidable-subtype P) ``` ### The full subtype at a universe level ```agda full-subtype : {l1 : Level} (l2 : Level) (A : UU l1) → subtype l2 A full-subtype l2 A x = raise-unit-Prop l2 type-full-subtype : {l1 : Level} (l2 : Level) (A : UU l1) → UU (l1 ⊔ l2) type-full-subtype l2 A = type-subtype (full-subtype l2 A) module _ {l1 l2 : Level} {A : UU l1} where is-in-full-subtype : (x : A) → is-in-subtype (full-subtype l2 A) x is-in-full-subtype x = raise-star inclusion-full-subtype : type-full-subtype l2 A → A inclusion-full-subtype = inclusion-subtype (full-subtype l2 A) is-equiv-inclusion-full-subtype : is-equiv inclusion-full-subtype is-equiv-inclusion-full-subtype = is-equiv-pr1-is-contr (λ a → is-contr-raise-unit) ``` ## Properties ### A subtype is full if and only if the inclusion is an equivalence ```agda module _ {l1 l2 : Level} {A : UU l1} (P : subtype l2 A) where is-equiv-inclusion-is-full-subtype : is-full-subtype P → is-equiv (inclusion-subtype P) is-equiv-inclusion-is-full-subtype H = is-equiv-pr1-is-contr ( λ x → is-proof-irrelevant-is-prop (is-prop-is-in-subtype P x) (H x)) equiv-inclusion-is-full-subtype : is-full-subtype P → type-subtype P ≃ A pr1 (equiv-inclusion-is-full-subtype H) = inclusion-subtype P pr2 (equiv-inclusion-is-full-subtype H) = is-equiv-inclusion-is-full-subtype H is-full-is-equiv-inclusion-subtype : is-equiv (inclusion-subtype P) → is-full-subtype P is-full-is-equiv-inclusion-subtype H x = tr ( is-in-subtype P) ( is-section-map-inv-is-equiv H x) ( pr2 (map-inv-is-equiv H x)) ```