diff --git a/src/foundation-core/contractible-maps.lagda.md b/src/foundation-core/contractible-maps.lagda.md index 4016cecbd3..46a3cecce5 100644 --- a/src/foundation-core/contractible-maps.lagda.md +++ b/src/foundation-core/contractible-maps.lagda.md @@ -129,8 +129,8 @@ module _ - For the notion of biinvertible maps see [`foundation.equivalences`](foundation.equivalences.md). -- For the notions of inverses and coherently invertible maps, also known as - half-adjoint equivalences, see +- For the notion of coherently invertible maps, also known as half-adjoint + equivalences, see [`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md). - For the notion of path-split maps see [`foundation.path-split-maps`](foundation.path-split-maps.md). diff --git a/src/foundation-core/equivalences.lagda.md b/src/foundation-core/equivalences.lagda.md index 4fdf05534e..2010a4a555 100644 --- a/src/foundation-core/equivalences.lagda.md +++ b/src/foundation-core/equivalences.lagda.md @@ -749,8 +749,8 @@ syntax step-equivalence-reasoning e Z f = e ≃ Z by f ## See also -- For the notions of inverses and coherently invertible maps, also known as - half-adjoint equivalences, see +- For the notion of coherently invertible maps, also known as half-adjoint + equivalences, see [`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md). - For the notion of maps with contractible fibers see [`foundation.contractible-maps`](foundation.contractible-maps.md). diff --git a/src/foundation-core/path-split-maps.lagda.md b/src/foundation-core/path-split-maps.lagda.md index 66ae437fa4..c2b94a4453 100644 --- a/src/foundation-core/path-split-maps.lagda.md +++ b/src/foundation-core/path-split-maps.lagda.md @@ -24,9 +24,9 @@ open import foundation-core.sections ## Idea A map `f : A → B` is said to be **path split** if it has a -[section](foundation-core.sections.md) and its action on -[identity types](foundation-core.identity-types.md) `Id x y → Id (f x) (f y)` -has a section for each `x y : A`. By the +[section](foundation-core.sections.md) and its +[action on identifications](foundation.action-on-identifications-functions.md) +`x = y → f x = f y` has a section for each `x y : A`. By the [fundamental theorem of identity types](foundation.fundamental-theorem-of-identity-types.md), it follows that a map is path-split if and only if it is an [equivalence](foundation-core.equivalences.md). @@ -80,8 +80,8 @@ module _ - For the notion of biinvertible maps see [`foundation.equivalences`](foundation.equivalences.md). -- For the notions of inverses and coherently invertible maps, also known as - half-adjoint equivalences, see +- For the notion of coherently invertible maps, also known as half-adjoint + equivalences, see [`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md). - For the notion of maps with contractible fibers see [`foundation.contractible-maps`](foundation.contractible-maps.md). diff --git a/src/foundation-core/sets.lagda.md b/src/foundation-core/sets.lagda.md index cecd9e33de..603e8413ec 100644 --- a/src/foundation-core/sets.lagda.md +++ b/src/foundation-core/sets.lagda.md @@ -147,4 +147,22 @@ abstract {l1 l2 : Level} (A : UU l1) {B : UU l2} (e : A ≃ B) → is-set A → is-set B is-set-equiv' = is-trunc-equiv' zero-𝕋 + +abstract + is-set-equiv-is-set : + {l1 l2 : Level} {A : UU l1} {B : UU l2} → + is-set A → is-set B → is-set (A ≃ B) + is-set-equiv-is-set = is-trunc-equiv-is-trunc zero-𝕋 + +module _ + {l1 l2 : Level} (A : Set l1) (B : Set l2) + where + + equiv-Set : UU (l1 ⊔ l2) + equiv-Set = type-Set A ≃ type-Set B + + equiv-set-Set : Set (l1 ⊔ l2) + pr1 equiv-set-Set = equiv-Set + pr2 equiv-set-Set = + is-set-equiv-is-set (is-set-type-Set A) (is-set-type-Set B) ``` diff --git a/src/foundation-core/transport-along-identifications.lagda.md b/src/foundation-core/transport-along-identifications.lagda.md index 67ef4e293d..968011e96f 100644 --- a/src/foundation-core/transport-along-identifications.lagda.md +++ b/src/foundation-core/transport-along-identifications.lagda.md @@ -110,7 +110,7 @@ module _ ```agda tr-Id-left : {l : Level} {A : UU l} {a b c : A} (q : b = c) (p : b = a) → - tr (_= a) q p = ((inv q) ∙ p) + tr (_= a) q p = (inv q ∙ p) tr-Id-left refl p = refl ``` diff --git a/src/foundation.lagda.md b/src/foundation.lagda.md index 1adc44d8a8..1badf21b0d 100644 --- a/src/foundation.lagda.md +++ b/src/foundation.lagda.md @@ -270,6 +270,7 @@ open import foundation.precomposition-type-families public open import foundation.preidempotent-maps public open import foundation.preimages-of-subtypes public open import foundation.preunivalence public +open import foundation.preunivalent-type-families public open import foundation.principle-of-omniscience public open import foundation.product-decompositions public open import foundation.product-decompositions-subuniverse public @@ -352,6 +353,7 @@ open import foundation.transport-along-equivalences public open import foundation.transport-along-higher-identifications public open import foundation.transport-along-homotopies public open import foundation.transport-along-identifications public +open import foundation.transport-split-type-families public open import foundation.transposition-span-diagrams public open import foundation.trivial-relaxed-sigma-decompositions public open import foundation.trivial-sigma-decompositions public diff --git a/src/foundation/category-of-sets.lagda.md b/src/foundation/category-of-sets.lagda.md index be56947a17..803e007a6a 100644 --- a/src/foundation/category-of-sets.lagda.md +++ b/src/foundation/category-of-sets.lagda.md @@ -68,7 +68,7 @@ is-large-category-Set-Large-Precategory : is-large-category-Set-Large-Precategory {l} X = fundamental-theorem-id ( is-contr-equiv' - ( Σ (Set l) (type-equiv-Set X)) + ( Σ (Set l) (equiv-Set X)) ( equiv-tot (equiv-iso-equiv-Set X)) ( is-torsorial-equiv-Set X)) ( iso-eq-Set X) diff --git a/src/foundation/contractible-maps.lagda.md b/src/foundation/contractible-maps.lagda.md index df0d7ac4bc..15c5bb6786 100644 --- a/src/foundation/contractible-maps.lagda.md +++ b/src/foundation/contractible-maps.lagda.md @@ -133,8 +133,8 @@ module _ - For the notion of biinvertible maps see [`foundation.equivalences`](foundation.equivalences.md). -- For the notions of inverses and coherently invertible maps, also known as - half-adjoint equivalences, see +- For the notion of coherently invertible maps, also known as half-adjoint + equivalences, see [`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md). - For the notion of path-split maps see [`foundation.path-split-maps`](foundation.path-split-maps.md). diff --git a/src/foundation/embeddings.lagda.md b/src/foundation/embeddings.lagda.md index d231edfd31..8a4e18fbe5 100644 --- a/src/foundation/embeddings.lagda.md +++ b/src/foundation/embeddings.lagda.md @@ -322,9 +322,9 @@ module _ abstract is-emb-section-ap : - ((x y : A) → section (ap f {x = x} {y = y})) → is-emb f - is-emb-section-ap section-ap-f x y = - fundamental-theorem-id-section x (λ y → ap f {y = y}) (section-ap-f x) y + ((x y : A) → section (ap f {x} {y})) → is-emb f + is-emb-section-ap section-ap-f x = + fundamental-theorem-id-section x (λ y → ap f) (section-ap-f x) ``` ### If there is an equivalence `(f x = f y) ≃ (x = y)` that sends `refl` to `refl`, then f is an embedding diff --git a/src/foundation/equivalences-maybe.lagda.md b/src/foundation/equivalences-maybe.lagda.md index 5a38bc210b..47f52136b4 100644 --- a/src/foundation/equivalences-maybe.lagda.md +++ b/src/foundation/equivalences-maybe.lagda.md @@ -380,6 +380,11 @@ equiv-equiv-Maybe : {l1 l2 : Level} {X : UU l1} {Y : UU l2} → (Maybe X ≃ Maybe Y) → (X ≃ Y) pr1 (equiv-equiv-Maybe e) = map-equiv-equiv-Maybe e pr2 (equiv-equiv-Maybe e) = is-equiv-map-equiv-equiv-Maybe e + +compute-equiv-equiv-Maybe-id-equiv : + {l1 : Level} {X : UU l1} → + equiv-equiv-Maybe id-equiv = id-equiv {A = X} +compute-equiv-equiv-Maybe-id-equiv = eq-htpy-equiv refl-htpy ``` ### For any set `X`, the type of automorphisms on `X` is equivalent to the type of automorphisms on `Maybe X` that fix the exception diff --git a/src/foundation/equivalences.lagda.md b/src/foundation/equivalences.lagda.md index e3e695b440..59256d5b1e 100644 --- a/src/foundation/equivalences.lagda.md +++ b/src/foundation/equivalences.lagda.md @@ -805,8 +805,8 @@ module _ ## See also -- For the notions of inverses and coherently invertible maps, also known as - half-adjoint equivalences, see +- For the notion of coherently invertible maps, also known as half-adjoint + equivalences, see [`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md). - For the notion of maps with contractible fibers see [`foundation.contractible-maps`](foundation.contractible-maps.md). diff --git a/src/foundation/fundamental-theorem-of-identity-types.lagda.md b/src/foundation/fundamental-theorem-of-identity-types.lagda.md index 5090cca6f8..57fa70fa94 100644 --- a/src/foundation/fundamental-theorem-of-identity-types.lagda.md +++ b/src/foundation/fundamental-theorem-of-identity-types.lagda.md @@ -8,11 +8,13 @@ module foundation.fundamental-theorem-of-identity-types where ```agda open import foundation.dependent-pair-types +open import foundation.retracts-of-types open import foundation.universe-levels open import foundation-core.contractible-types open import foundation-core.equivalences open import foundation-core.families-of-equivalences +open import foundation-core.function-types open import foundation-core.functoriality-dependent-pair-types open import foundation-core.homotopies open import foundation-core.identity-types @@ -87,7 +89,7 @@ module _ abstract fundamental-theorem-id-J' : - (is-fiberwise-equiv (ind-Id a (λ x p → B x) b)) → is-torsorial B + is-fiberwise-equiv (ind-Id a (λ x p → B x) b) → is-torsorial B fundamental-theorem-id-J' H = is-contr-is-equiv' ( Σ A (Id a)) @@ -105,18 +107,29 @@ module _ abstract fundamental-theorem-id-retraction : - (i : (x : A) → B x → a = x) → (R : (x : A) → retraction (i x)) → + (i : (x : A) → B x → a = x) → + ((x : A) → retraction (i x)) → is-fiberwise-equiv i fundamental-theorem-id-retraction i R = is-fiberwise-equiv-is-equiv-tot ( is-equiv-is-contr (tot i) - ( is-contr-retract-of (Σ _ (λ y → a = y)) - ( pair (tot i) - ( pair (tot λ x → pr1 (R x)) - ( ( inv-htpy (preserves-comp-tot i (λ x → pr1 (R x)))) ∙h - ( ( tot-htpy λ x → pr2 (R x)) ∙h (tot-id B))))) + ( is-contr-retract-of + ( Σ _ (λ y → a = y)) + ( ( tot i) , + ( tot (λ x → pr1 (R x))) , + ( ( inv-htpy (preserves-comp-tot i (pr1 ∘ R))) ∙h + ( tot-htpy (pr2 ∘ R)) ∙h + ( tot-id B))) ( is-torsorial-path a)) ( is-torsorial-path a)) + + fundamental-theorem-id-retract : + (R : (x : A) → (B x) retract-of (a = x)) → + is-fiberwise-equiv (inclusion-retract ∘ R) + fundamental-theorem-id-retract R = + fundamental-theorem-id-retraction + ( inclusion-retract ∘ R) + ( retraction-retract ∘ R) ``` ### The fundamental theorem of identity types, using sections @@ -128,19 +141,18 @@ module _ abstract fundamental-theorem-id-section : - (f : (x : A) → a = x → B x) → ((x : A) → section (f x)) → + (f : (x : A) → a = x → B x) → + ((x : A) → section (f x)) → is-fiberwise-equiv f fundamental-theorem-id-section f section-f x = - is-equiv-section-is-equiv (f x) (section-f x) (is-fiberwise-equiv-i x) - where - i : (x : A) → B x → a = x - i = λ x → pr1 (section-f x) - retraction-i : (x : A) → retraction (i x) - pr1 (retraction-i x) = f x - pr2 (retraction-i x) = pr2 (section-f x) - is-fiberwise-equiv-i : is-fiberwise-equiv i - is-fiberwise-equiv-i = - fundamental-theorem-id-retraction a i retraction-i + is-equiv-section-is-equiv + ( f x) + ( section-f x) + ( fundamental-theorem-id-retraction + ( a) + ( λ x → map-section (f x) (section-f x)) + ( λ x → (f x , is-section-map-section (f x) (section-f x))) + ( x)) ``` ## See also diff --git a/src/foundation/identity-systems.lagda.md b/src/foundation/identity-systems.lagda.md index 4829557c6b..44e04f05f9 100644 --- a/src/foundation/identity-systems.lagda.md +++ b/src/foundation/identity-systems.lagda.md @@ -15,6 +15,7 @@ open import foundation.universe-levels open import foundation-core.contractible-types open import foundation-core.families-of-equivalences open import foundation-core.identity-types +open import foundation-core.propositions open import foundation-core.sections open import foundation-core.torsorial-type-families open import foundation-core.transport-along-identifications @@ -59,11 +60,11 @@ module _ ```agda module _ - {l1 l2 : Level} {A : UU l1} (B : A → UU l2) (a : A) (b : B a) - where + {l1 l2 : Level} {A : UU l1} (B : A → UU l2) (a : A) (b : B a) + where - is-identity-system : UUω - is-identity-system = {l : Level} → is-identity-system-Level l B a b + is-identity-system : UUω + is-identity-system = {l : Level} → is-identity-system-Level l B a b ``` ## Properties diff --git a/src/foundation/isomorphisms-of-sets.lagda.md b/src/foundation/isomorphisms-of-sets.lagda.md index f13a4ac68e..c1f3c53125 100644 --- a/src/foundation/isomorphisms-of-sets.lagda.md +++ b/src/foundation/isomorphisms-of-sets.lagda.md @@ -73,15 +73,15 @@ module _ ( htpy-eq (pr1 (pr2 H))) ( htpy-eq (pr2 (pr2 H))) - iso-equiv-Set : type-equiv-Set A B → iso-Set + iso-equiv-Set : equiv-Set A B → iso-Set pr1 (iso-equiv-Set e) = map-equiv e pr2 (iso-equiv-Set e) = is-iso-is-equiv-Set (is-equiv-map-equiv e) - equiv-iso-Set : iso-Set → type-equiv-Set A B + equiv-iso-Set : iso-Set → equiv-Set A B pr1 (equiv-iso-Set f) = map-iso-Set f pr2 (equiv-iso-Set f) = is-equiv-is-iso-Set (is-iso-map-iso-Set f) - equiv-iso-equiv-Set : type-equiv-Set A B ≃ iso-Set + equiv-iso-equiv-Set : equiv-Set A B ≃ iso-Set equiv-iso-equiv-Set = equiv-type-subtype ( is-property-is-equiv) diff --git a/src/foundation/path-split-maps.lagda.md b/src/foundation/path-split-maps.lagda.md index a55bbed9d3..57d49b87c3 100644 --- a/src/foundation/path-split-maps.lagda.md +++ b/src/foundation/path-split-maps.lagda.md @@ -74,8 +74,8 @@ module _ - For the notion of biinvertible maps see [`foundation.equivalences`](foundation.equivalences.md). -- For the notions of inverses and coherently invertible maps, also known as - half-adjoint equivalences, see +- For the notion of coherently invertible maps, also known as half-adjoint + equivalences, see [`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md). - For the notion of maps with contractible fibers see [`foundation.contractible-maps`](foundation.contractible-maps.md). diff --git a/src/foundation/preunivalence.lagda.md b/src/foundation/preunivalence.lagda.md index be874acfdd..298f482891 100644 --- a/src/foundation/preunivalence.lagda.md +++ b/src/foundation/preunivalence.lagda.md @@ -107,4 +107,5 @@ preunivalence = preunivalence-axiom-univalence-axiom univalence - Preunivalence is sufficient to prove that `Id : A → (A → 𝒰)` is an embedding. This fact is proven in [`foundation.universal-property-identity-types`](foundation.universal-property-identity-types.md) +- [Preunivalent type families](foundation.preunivalent-type-families.md) - [Preunivalent categories](category-theory.preunivalent-categories.md) diff --git a/src/foundation/preunivalent-type-families.lagda.md b/src/foundation/preunivalent-type-families.lagda.md new file mode 100644 index 0000000000..5d647dfedd --- /dev/null +++ b/src/foundation/preunivalent-type-families.lagda.md @@ -0,0 +1,177 @@ +# Preunivalent type families + +```agda +module foundation.preunivalent-type-families where +``` + +
Imports + +```agda +open import foundation.0-maps +open import foundation.action-on-identifications-functions +open import foundation.dependent-pair-types +open import foundation.embeddings +open import foundation.equivalence-injective-type-families +open import foundation.faithful-maps +open import foundation.function-types +open import foundation.preunivalence +open import foundation.retractions +open import foundation.subuniverses +open import foundation.transport-along-identifications +open import foundation.universe-levels + +open import foundation-core.equivalences +open import foundation-core.identity-types +open import foundation-core.injective-maps +open import foundation-core.sets +open import foundation-core.univalence +``` + +
+ +## Idea + +A type family `B` over `A` is said to be +{{#concept "preunivalent" Disambiguation="type family" Agda=is-preunivalent}} if +the map + +```text + equiv-tr B : x = y → B x ≃ B y +``` + +is an [embedding](foundation-core.embeddings.md) for every `x y : A`. + +## Definition + +```agda +is-preunivalent : + {l1 l2 : Level} {A : UU l1} → (A → UU l2) → UU (l1 ⊔ l2) +is-preunivalent {A = A} B = (x y : A) → is-emb (λ (p : x = y) → equiv-tr B p) +``` + +## Properties + +### Assuming the preunivalence axiom, type families are preunivalent if and only if they are faithful as maps + +**Proof:** We have the +[commuting triangle of maps](foundation-core.commuting-triangles-of-maps.md) + +```text + ap B + (x = y) -----> (B x = B y) + \ / + \ / + equiv-tr B \ / equiv-eq + v v + (B x ≃ B y) +``` + +where the right edge is an embedding by the +[preunivalence axiom](foundation.preunivalence.md). Hence, the top map is an +embedding if and only if the left map is. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + abstract + is-faithful-is-preunivalent : + is-preunivalent B → is-faithful B + is-faithful-is-preunivalent U x y = + is-emb-top-map-triangle + ( equiv-tr B) + ( equiv-eq) + ( ap B) + ( λ where refl → refl) + ( preunivalence (B x) (B y)) + ( U x y) + + is-preunivalent-is-faithful : + is-faithful B → is-preunivalent B + is-preunivalent-is-faithful is-faithful-B x y = + is-emb-left-map-triangle + ( equiv-tr B) + ( equiv-eq) + ( ap B) + ( λ where refl → refl) + ( preunivalence (B x) (B y)) + ( is-faithful-B x y) + + is-0-map-is-preunivalent : + is-preunivalent B → is-0-map B + is-0-map-is-preunivalent U = + is-0-map-is-faithful (is-faithful-is-preunivalent U) + + is-preunivalent-is-0-map : + is-0-map B → is-preunivalent B + is-preunivalent-is-0-map H = + is-preunivalent-is-faithful (is-faithful-is-0-map H) +``` + +### Families of sets are preunivalent if `equiv-tr` is fiberwise injective + +```agda +module _ + {l1 l2 : Level} {A : UU l1} (B : A → UU l2) + (is-set-B : (x : A) → is-set (B x)) + where + + is-preunivalent-is-injective-equiv-tr-is-set : + ((x y : A) → is-injective (equiv-tr B {x} {y})) → + is-preunivalent B + is-preunivalent-is-injective-equiv-tr-is-set is-inj-B x y = + is-emb-is-injective + ( is-set-equiv-is-set (is-set-B x) (is-set-B y)) + ( is-inj-B x y) + + is-preunivalent-retraction-equiv-tr-is-set : + ((x y : A) → retraction (equiv-tr B {x} {y})) → + is-preunivalent B + is-preunivalent-retraction-equiv-tr-is-set R = + is-preunivalent-is-injective-equiv-tr-is-set + ( λ x y → is-injective-retraction (equiv-tr B) (R x y)) + +module _ + {l1 l2 : Level} {A : UU l1} (B : A → Set l2) + where + + is-preunivalent-is-injective-equiv-tr-Set : + ((x y : A) → is-injective (equiv-tr (type-Set ∘ B) {x} {y})) → + is-preunivalent (type-Set ∘ B) + is-preunivalent-is-injective-equiv-tr-Set = + is-preunivalent-is-injective-equiv-tr-is-set + ( type-Set ∘ B) + ( is-set-type-Set ∘ B) + + is-preunivalent-retraction-equiv-tr-Set : + ((x y : A) → retraction (equiv-tr (type-Set ∘ B) {x} {y})) → + is-preunivalent (type-Set ∘ B) + is-preunivalent-retraction-equiv-tr-Set = + is-preunivalent-retraction-equiv-tr-is-set + ( type-Set ∘ B) + ( is-set-type-Set ∘ B) +``` + +### Inclusions of subuniverses into the universe are preunivalent + +**Note.** These proofs rely on essential use of the preunivalence axiom. + +```agda +is-preunivalent-projection-Type-With-Set-Element : + {l1 l2 : Level} (S : UU l1 → Set l2) → + is-preunivalent (pr1 {A = UU l1} {B = type-Set ∘ S}) +is-preunivalent-projection-Type-With-Set-Element S = + is-preunivalent-is-0-map (is-0-map-pr1 (is-set-type-Set ∘ S)) + +is-preunivalent-inclusion-subuniverse : + {l1 l2 : Level} (S : subuniverse l1 l2) → + is-preunivalent (inclusion-subuniverse S) +is-preunivalent-inclusion-subuniverse S = + is-preunivalent-projection-Type-With-Set-Element (set-Prop ∘ S) +``` + +## See also + +- [Univalent type families](foundation.univalent-type-families.md) +- [Transport-split type families](foundation.transport-split-type-families.md) diff --git a/src/foundation/set-truncations.lagda.md b/src/foundation/set-truncations.lagda.md index 8e4f26493e..c5080bce61 100644 --- a/src/foundation/set-truncations.lagda.md +++ b/src/foundation/set-truncations.lagda.md @@ -423,7 +423,7 @@ module _ abstract distributive-trunc-coprod-Set : is-contr - ( Σ ( type-equiv-Set + ( Σ ( equiv-Set ( trunc-Set (A + B)) ( coprod-Set (trunc-Set A) (trunc-Set B))) ( λ e → @@ -451,7 +451,7 @@ module _ ( is-set-truncation-trunc-Set B C)))) equiv-distributive-trunc-coprod-Set : - type-equiv-Set (trunc-Set (A + B)) (coprod-Set (trunc-Set A) (trunc-Set B)) + equiv-Set (trunc-Set (A + B)) (coprod-Set (trunc-Set A) (trunc-Set B)) equiv-distributive-trunc-coprod-Set = pr1 (center distributive-trunc-coprod-Set) diff --git a/src/foundation/sets.lagda.md b/src/foundation/sets.lagda.md index 8799c286aa..862fb3d31a 100644 --- a/src/foundation/sets.lagda.md +++ b/src/foundation/sets.lagda.md @@ -13,6 +13,7 @@ open import foundation.contractible-types open import foundation.dependent-pair-types open import foundation.subuniverses open import foundation.truncated-types +open import foundation.univalent-type-families open import foundation.universe-levels open import foundation-core.1-types @@ -23,6 +24,7 @@ open import foundation-core.identity-types open import foundation-core.precomposition-functions open import foundation-core.propositional-maps open import foundation-core.propositions +open import foundation-core.subtypes open import foundation-core.torsorial-type-families open import foundation-core.truncation-levels ``` @@ -173,28 +175,6 @@ precomp-Set : precomp-Set f C = precomp f (type-Set C) ``` -### The type of equivalences between sets is a set - -```agda -module _ - {l1 l2 : Level} {A : UU l1} {B : UU l2} - where - - is-set-equiv-is-set : is-set A → is-set B → is-set (A ≃ B) - is-set-equiv-is-set = is-trunc-equiv-is-trunc zero-𝕋 - -module _ - {l1 l2 : Level} (A : Set l1) (B : Set l2) - where - - type-equiv-Set : UU (l1 ⊔ l2) - type-equiv-Set = type-Set A ≃ type-Set B - - equiv-Set : Set (l1 ⊔ l2) - pr1 equiv-Set = type-equiv-Set - pr2 equiv-Set = is-set-equiv-is-set (is-set-type-Set A) (is-set-type-Set B) -``` - ### Extensionality of sets ```agda @@ -202,11 +182,11 @@ module _ {l : Level} (X : Set l) where - equiv-eq-Set : (Y : Set l) → X = Y → type-equiv-Set X Y + equiv-eq-Set : (Y : Set l) → X = Y → equiv-Set X Y equiv-eq-Set = equiv-eq-subuniverse is-set-Prop X abstract - is-torsorial-equiv-Set : is-torsorial (λ (Y : Set l) → type-equiv-Set X Y) + is-torsorial-equiv-Set : is-torsorial (λ (Y : Set l) → equiv-Set X Y) is-torsorial-equiv-Set = is-torsorial-equiv-subuniverse is-set-Prop X @@ -214,10 +194,10 @@ module _ is-equiv-equiv-eq-Set : (Y : Set l) → is-equiv (equiv-eq-Set Y) is-equiv-equiv-eq-Set = is-equiv-equiv-eq-subuniverse is-set-Prop X - eq-equiv-Set : (Y : Set l) → type-equiv-Set X Y → X = Y + eq-equiv-Set : (Y : Set l) → equiv-Set X Y → X = Y eq-equiv-Set Y = eq-equiv-subuniverse is-set-Prop - extensionality-Set : (Y : Set l) → (X = Y) ≃ type-equiv-Set X Y + extensionality-Set : (Y : Set l) → (X = Y) ≃ equiv-Set X Y pr1 (extensionality-Set Y) = equiv-eq-Set Y pr2 (extensionality-Set Y) = is-equiv-equiv-eq-Set Y ``` @@ -263,3 +243,23 @@ set-Truncated-Type : pr1 (set-Truncated-Type k A) = type-Set A pr2 (set-Truncated-Type k A) = is-trunc-is-set k (is-set-type-Set A) ``` + +### The type of equivalences is a set if the domain or codomain is a set + +```agda +abstract + is-set-equiv-is-set-codomain : + {l1 l2 : Level} {A : UU l1} {B : UU l2} → is-set B → is-set (A ≃ B) + is-set-equiv-is-set-codomain = is-trunc-equiv-is-trunc-codomain neg-one-𝕋 + + is-set-equiv-is-set-domain : + {l1 l2 : Level} {A : UU l1} {B : UU l2} → is-set A → is-set (A ≃ B) + is-set-equiv-is-set-domain = is-trunc-equiv-is-trunc-domain neg-one-𝕋 +``` + +### The canonical type family over `Set` is univalent + +```agda +is-univalent-type-Set : {l : Level} → is-univalent (type-Set {l}) +is-univalent-type-Set = is-univalent-inclusion-subuniverse is-set-Prop +``` diff --git a/src/foundation/transport-along-identifications.lagda.md b/src/foundation/transport-along-identifications.lagda.md index 35d9f29985..0edb4f76e6 100644 --- a/src/foundation/transport-along-identifications.lagda.md +++ b/src/foundation/transport-along-identifications.lagda.md @@ -56,7 +56,7 @@ module _ ( is-section-inv-tr p) ( is-retraction-inv-tr p) - equiv-tr : x = y → (B x) ≃ (B y) + equiv-tr : x = y → B x ≃ B y pr1 (equiv-tr p) = tr B p pr2 (equiv-tr p) = is-equiv-tr p ``` diff --git a/src/foundation/transport-split-type-families.lagda.md b/src/foundation/transport-split-type-families.lagda.md new file mode 100644 index 0000000000..f4fc0dad2f --- /dev/null +++ b/src/foundation/transport-split-type-families.lagda.md @@ -0,0 +1,158 @@ +# Transport-split type families + +```agda +module foundation.transport-split-type-families where +``` + +
Imports + +```agda +open import elementary-number-theory.natural-numbers + +open import foundation.action-on-equivalences-functions +open import foundation.action-on-identifications-functions +open import foundation.cartesian-product-types +open import foundation.dependent-pair-types +open import foundation.equivalence-extensionality +open import foundation.equivalence-injective-type-families +open import foundation.equivalences +open import foundation.function-extensionality +open import foundation.fundamental-theorem-of-identity-types +open import foundation.iterated-dependent-product-types +open import foundation.transport-along-identifications +open import foundation.unit-type +open import foundation.univalent-type-families +open import foundation.universal-property-identity-systems +open import foundation.universe-levels + +open import foundation-core.embeddings +open import foundation-core.identity-types +open import foundation-core.propositions +open import foundation-core.sections +open import foundation-core.torsorial-type-families +``` + +
+ +## Idea + +A type family `B` over `A` is said to be +{{#concept "transport-split" Disambiguation="type family" Agda=is-transport-split}} +if the map + +```text + equiv-tr B : x = y → B x ≃ B y +``` + +admits a [section](foundation-core.sections.md) for every `x y : A`. By a +corollary of +[the fundamental theorem of identity types](foundation.fundamental-theorem-of-identity-types.md) +every transport-split type family is +[univalent](foundation.univalent-type-families.md), meaning that `equiv-tr B` is +in fact an [equivalence](foundation-core.equivalences.md) for all `x y : A`. + +## Definition + +### Transport-split type families + +```agda +is-transport-split : + {l1 l2 : Level} {A : UU l1} → (A → UU l2) → UU (l1 ⊔ l2) +is-transport-split {A = A} B = + (x y : A) → section (λ (p : x = y) → equiv-tr B p) +``` + +## Properties + +### Transport-split type families are equivalence injective + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + is-equivalence-injective-is-transport-split : + is-transport-split B → is-equivalence-injective B + is-equivalence-injective-is-transport-split s {x} {y} = + map-section (equiv-tr B) (s x y) +``` + +### Transport-split type families are univalent + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + is-transport-split-is-univalent : + is-univalent B → is-transport-split B + is-transport-split-is-univalent U x y = section-is-equiv (U x y) + + is-univalent-is-transport-split : + is-transport-split B → is-univalent B + is-univalent-is-transport-split s x = + fundamental-theorem-id-section x (λ y → equiv-tr B) (s x) +``` + +### The type `is-transport-split` is a proposition + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + is-proof-irrelevant-is-transport-split : + is-proof-irrelevant (is-transport-split B) + is-proof-irrelevant-is-transport-split s = + is-contr-iterated-Π 2 + ( λ x y → + is-contr-section-is-equiv (is-univalent-is-transport-split s x y)) + + is-prop-is-transport-split : + is-prop (is-transport-split B) + is-prop-is-transport-split = + is-prop-is-proof-irrelevant is-proof-irrelevant-is-transport-split +``` + +### Assuming the univalence axiom, type families are transport-split if and only if they are embeddings as maps + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + is-emb-is-transport-split : is-transport-split B → is-emb B + is-emb-is-transport-split s = + is-emb-is-univalent (is-univalent-is-transport-split s) + + is-transport-split-is-emb : is-emb B → is-transport-split B + is-transport-split-is-emb H = + is-transport-split-is-univalent (is-univalent-is-emb H) +``` + +### Transport-split type families satisfy equivalence induction + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + (s : is-transport-split B) + where + + is-torsorial-fam-equiv-is-transport-split : + {x : A} → is-torsorial (λ y → B x ≃ B y) + is-torsorial-fam-equiv-is-transport-split = + is-torsorial-fam-equiv-is-univalent (is-univalent-is-transport-split s) + + dependent-universal-property-identity-system-fam-equiv-is-transport-split : + {x : A} → + dependent-universal-property-identity-system (λ y → B x ≃ B y) id-equiv + dependent-universal-property-identity-system-fam-equiv-is-transport-split = + dependent-universal-property-identity-system-is-torsorial + ( id-equiv) + ( is-torsorial-fam-equiv-is-transport-split) +``` + +## See also + +- [Univalent type families](foundation.univalent-type-families.md) +- [Preunivalent type families](foundation.preunivalent-type-families.md) diff --git a/src/foundation/truncated-types.lagda.md b/src/foundation/truncated-types.lagda.md index 33d95d4812..3adb80b12a 100644 --- a/src/foundation/truncated-types.lagda.md +++ b/src/foundation/truncated-types.lagda.md @@ -12,13 +12,13 @@ open import foundation-core.truncated-types public open import elementary-number-theory.natural-numbers open import foundation.dependent-pair-types +open import foundation.equivalences open import foundation.subtype-identity-principle open import foundation.truncation-levels open import foundation.univalence open import foundation.universe-levels open import foundation-core.embeddings -open import foundation-core.equivalences open import foundation-core.identity-types open import foundation-core.propositions open import foundation-core.subtypes @@ -110,3 +110,32 @@ module _ ( is-trunc-equiv' k A e) ( is-trunc-equiv k B e) ``` + +### If the domain or codomain is `k+1`-truncated, then the type of equivalences is `k+1`-truncated + +```agda +module _ + {l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} + where + + is-trunc-equiv-is-trunc-codomain : + is-trunc (succ-𝕋 k) B → is-trunc (succ-𝕋 k) (A ≃ B) + is-trunc-equiv-is-trunc-codomain is-trunc-B = + is-trunc-type-subtype + ( k) + ( is-equiv-Prop) + ( is-trunc-function-type (succ-𝕋 k) is-trunc-B) + +module _ + {l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} + where + + is-trunc-equiv-is-trunc-domain : + is-trunc (succ-𝕋 k) A → is-trunc (succ-𝕋 k) (A ≃ B) + is-trunc-equiv-is-trunc-domain is-trunc-A = + is-trunc-equiv + ( succ-𝕋 k) + ( B ≃ A) + ( equiv-inv-equiv) + ( is-trunc-equiv-is-trunc-codomain k is-trunc-A) +``` diff --git a/src/foundation/univalent-type-families.lagda.md b/src/foundation/univalent-type-families.lagda.md index 8297c1c7a7..d68a061924 100644 --- a/src/foundation/univalent-type-families.lagda.md +++ b/src/foundation/univalent-type-families.lagda.md @@ -7,29 +7,164 @@ module foundation.univalent-type-families where
Imports ```agda +open import foundation.action-on-identifications-functions +open import foundation.dependent-pair-types +open import foundation.equality-dependent-pair-types +open import foundation.equivalences +open import foundation.fundamental-theorem-of-identity-types +open import foundation.identity-systems +open import foundation.iterated-dependent-product-types +open import foundation.propositions +open import foundation.subuniverses open import foundation.transport-along-identifications +open import foundation.univalence +open import foundation.universal-property-identity-systems open import foundation.universe-levels -open import foundation-core.equivalences +open import foundation-core.embeddings open import foundation-core.identity-types +open import foundation-core.sections +open import foundation-core.torsorial-type-families ```
## Idea -A type family `B` over `A` is said to be univalent if the map +A type family `B` over `A` is said to be +{{#concept "univalent" Disambiguation="type family" Agda=is-univalent}} if the +map ```text - equiv-tr : (Id x y) → (B x ≃ B y) + equiv-tr B : x = y → B x ≃ B y ``` -is an equivalence for every `x y : A`. +is an [equivalence](foundation-core.equivalences.md) for every `x y : A`. By +[the univalence axiom](foundation-core.univalence.md), this is equivalent to the +type family `B` being an [embedding](foundation-core.embeddings.md) considered +as a map. ## Definition +### The predicate on type families of being univalent + ```agda is-univalent : {l1 l2 : Level} {A : UU l1} → (A → UU l2) → UU (l1 ⊔ l2) is-univalent {A = A} B = (x y : A) → is-equiv (λ (p : x = y) → equiv-tr B p) + +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + is-prop-is-univalent : is-prop (is-univalent B) + is-prop-is-univalent = + is-prop-iterated-Π 2 (λ x y → is-property-is-equiv (equiv-tr B)) + + is-univalent-Prop : Prop (l1 ⊔ l2) + pr1 is-univalent-Prop = is-univalent B + pr2 is-univalent-Prop = is-prop-is-univalent +``` + +### Univalent type families + +```agda +univalent-type-family : + {l1 : Level} (l2 : Level) (A : UU l1) → UU (l1 ⊔ lsuc l2) +univalent-type-family l2 A = Σ (A → UU l2) is-univalent +``` + +## Properties + +### Assuming the univalence axiom, type families are univalent if and only if they are embeddings as maps + +**Proof:** We have the +[commuting triangle of maps](foundation-core.commuting-triangles-of-maps.md) + +```text + ap B + (x = y) -----> (B x = B y) + \ / + \ / + equiv-tr B \ / equiv-eq + v v + (B x ≃ B y) +``` + +where the right edge is an equivalence by the univalence axiom. Hence, the top +map is an equivalence if and only if the left map is. + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + where + + abstract + is-emb-is-univalent : + is-univalent B → is-emb B + is-emb-is-univalent U x y = + is-equiv-top-map-triangle + ( equiv-tr B) + ( equiv-eq) + ( ap B) + ( λ where refl → refl) + ( univalence (B x) (B y)) + ( U x y) + + is-univalent-is-emb : + is-emb B → is-univalent B + is-univalent-is-emb is-emb-B x y = + is-equiv-left-map-triangle + ( equiv-tr B) + ( equiv-eq) + ( ap B) + ( λ where refl → refl) + ( is-emb-B x y) + ( univalence (B x) (B y)) +``` + +### Univalent type families satisfy equivalence induction + +```agda +module _ + {l1 l2 : Level} {A : UU l1} {B : A → UU l2} + (U : is-univalent B) + where + + is-torsorial-fam-equiv-is-univalent : + {x : A} → is-torsorial (λ y → B x ≃ B y) + is-torsorial-fam-equiv-is-univalent {x} = + fundamental-theorem-id' (λ y → equiv-tr B) (U x) + + dependent-universal-property-identity-system-fam-equiv-is-univalent : + {x : A} → + dependent-universal-property-identity-system (λ y → B x ≃ B y) id-equiv + dependent-universal-property-identity-system-fam-equiv-is-univalent {x} = + dependent-universal-property-identity-system-is-torsorial + ( id-equiv) + ( is-torsorial-fam-equiv-is-univalent {x}) ``` + +### Inclusions of subuniverses into the universe are univalent + +**Note.** This proof relies on essential use of the univalence axiom. + +```agda +module _ + {l1 l2 : Level} (S : subuniverse l1 l2) + where + + is-univalent-inclusion-subuniverse : is-univalent (inclusion-subuniverse S) + is-univalent-inclusion-subuniverse = + is-univalent-is-emb (is-emb-inclusion-subuniverse S) +``` + +## See also + +- [Preunivalent type families](foundation.preunivalent-type-families.md) +- [Transport-split type families](foundation.transport-split-type-families.md): + By a corollary of + [the fundamental theorem of identity types](foundation.fundamental-theorem-of-identity-types.md), + `equiv-tr B` is a + [fiberwise equivalence](foundation-core.families-of-equivalences.md) as soon + as it admits a fiberwise [section](foundation-core.sections.md). diff --git a/src/foundation/universal-property-identity-systems.lagda.md b/src/foundation/universal-property-identity-systems.lagda.md index 8748ea89d0..a29595fa9d 100644 --- a/src/foundation/universal-property-identity-systems.lagda.md +++ b/src/foundation/universal-property-identity-systems.lagda.md @@ -36,8 +36,8 @@ also follows for identity systems. ```agda dependent-universal-property-identity-system : - {l1 l2 : Level} {A : UU l1} {B : A → UU l2} {a : A} (b : B a) → UUω -dependent-universal-property-identity-system {A = A} {B} b = + {l1 l2 : Level} {A : UU l1} (B : A → UU l2) {a : A} (b : B a) → UUω +dependent-universal-property-identity-system {A = A} B b = {l3 : Level} (P : (x : A) (y : B x) → UU l3) → is-equiv (ev-refl-identity-system b {P}) ``` @@ -53,7 +53,7 @@ module _ dependent-universal-property-identity-system-is-torsorial : is-torsorial B → - dependent-universal-property-identity-system {B = B} b + dependent-universal-property-identity-system B b dependent-universal-property-identity-system-is-torsorial H P = is-equiv-left-factor @@ -75,7 +75,7 @@ module _ dependent-universal-property-identity-system-is-torsorial H _ is-torsorial-dependent-universal-property-identity-system : - dependent-universal-property-identity-system {B = B} b → + dependent-universal-property-identity-system B b → is-torsorial B pr1 (is-torsorial-dependent-universal-property-identity-system H) = (a , b) pr2 (is-torsorial-dependent-universal-property-identity-system H) u = @@ -95,13 +95,13 @@ module _ dependent-universal-property-identity-system-is-identity-system : is-identity-system B a b → - dependent-universal-property-identity-system {B = B} b + dependent-universal-property-identity-system B b dependent-universal-property-identity-system-is-identity-system H = dependent-universal-property-identity-system-is-torsorial b ( is-torsorial-is-identity-system a b H) is-identity-system-dependent-universal-property-identity-system : - dependent-universal-property-identity-system {B = B} b → + dependent-universal-property-identity-system B b → is-identity-system B a b is-identity-system-dependent-universal-property-identity-system H P = section-is-equiv (H P) diff --git a/src/group-theory/equivalences-concrete-group-actions.lagda.md b/src/group-theory/equivalences-concrete-group-actions.lagda.md index a631706793..27c37431a5 100644 --- a/src/group-theory/equivalences-concrete-group-actions.lagda.md +++ b/src/group-theory/equivalences-concrete-group-actions.lagda.md @@ -41,7 +41,7 @@ module _ equiv-action-Concrete-Group : {l3 : Level} (Y : action-Concrete-Group l3 G) → UU (l1 ⊔ l2 ⊔ l3) equiv-action-Concrete-Group Y = - (u : classifying-type-Concrete-Group G) → type-equiv-Set (X u) (Y u) + (u : classifying-type-Concrete-Group G) → equiv-Set (X u) (Y u) id-equiv-action-Concrete-Group : equiv-action-Concrete-Group X id-equiv-action-Concrete-Group u = id-equiv @@ -50,7 +50,7 @@ module _ (Y : action-Concrete-Group l2 G) → (X = Y) ≃ equiv-action-Concrete-Group Y extensionality-action-Concrete-Group = extensionality-Π X - ( λ u → type-equiv-Set (X u)) + ( λ u → equiv-Set (X u)) ( λ u → extensionality-Set (X u)) equiv-eq-action-Concrete-Group : diff --git a/src/group-theory/symmetric-concrete-groups.lagda.md b/src/group-theory/symmetric-concrete-groups.lagda.md index b329c223a9..006ef44e03 100644 --- a/src/group-theory/symmetric-concrete-groups.lagda.md +++ b/src/group-theory/symmetric-concrete-groups.lagda.md @@ -57,7 +57,7 @@ module _ equiv-classifying-type-symmetric-Concrete-Group : (X Y : classifying-type-symmetric-Concrete-Group A) → UU l equiv-classifying-type-symmetric-Concrete-Group X Y = - type-equiv-Set (pr1 X) (pr1 Y) + equiv-Set (pr1 X) (pr1 Y) type-symmetric-Concrete-Group : UU l type-symmetric-Concrete-Group = diff --git a/src/univalent-combinatorics/2-element-types.lagda.md b/src/univalent-combinatorics/2-element-types.lagda.md index b15edfc919..01e0347945 100644 --- a/src/univalent-combinatorics/2-element-types.lagda.md +++ b/src/univalent-combinatorics/2-element-types.lagda.md @@ -410,7 +410,7 @@ is-identity-system-type-2-Element-Type X x = dependent-universal-property-identity-system-type-2-Element-Type : {l1 : Level} (X : 2-Element-Type l1) (x : type-2-Element-Type X) → dependent-universal-property-identity-system - { B = type-2-Element-Type {l1}} + ( type-2-Element-Type {l1}) { a = X} ( x) dependent-universal-property-identity-system-type-2-Element-Type X x = diff --git a/src/univalent-combinatorics/standard-finite-types.lagda.md b/src/univalent-combinatorics/standard-finite-types.lagda.md index aec18df6b8..9103b85ba3 100644 --- a/src/univalent-combinatorics/standard-finite-types.lagda.md +++ b/src/univalent-combinatorics/standard-finite-types.lagda.md @@ -30,8 +30,13 @@ open import foundation.injective-maps open import foundation.negated-equality open import foundation.negation open import foundation.noncontractible-types +open import foundation.path-algebra +open import foundation.preunivalent-type-families open import foundation.raising-universe-levels +open import foundation.retractions +open import foundation.sections open import foundation.sets +open import foundation.transport-along-identifications open import foundation.unit-type open import foundation.universe-levels @@ -427,22 +432,55 @@ leq-nat-succ-Fin (succ-ℕ k) (inr star) = ( leq-zero-ℕ (succ-ℕ (nat-Fin (succ-ℕ k) (inr star)))) ``` -### Fin is injective +### `Fin` is injective ```agda -abstract - is-equivalence-injective-Fin : is-equivalence-injective Fin - is-equivalence-injective-Fin {zero-ℕ} {zero-ℕ} e = - refl - is-equivalence-injective-Fin {zero-ℕ} {succ-ℕ l} e = - ex-falso (map-inv-equiv e (zero-Fin l)) - is-equivalence-injective-Fin {succ-ℕ k} {zero-ℕ} e = - ex-falso (map-equiv e (zero-Fin k)) - is-equivalence-injective-Fin {succ-ℕ k} {succ-ℕ l} e = - ap succ-ℕ (is-equivalence-injective-Fin (equiv-equiv-Maybe e)) +is-equivalence-injective-Fin : is-equivalence-injective Fin +is-equivalence-injective-Fin {zero-ℕ} {zero-ℕ} e = + refl +is-equivalence-injective-Fin {zero-ℕ} {succ-ℕ l} e = + ex-falso (map-inv-equiv e (zero-Fin l)) +is-equivalence-injective-Fin {succ-ℕ k} {zero-ℕ} e = + ex-falso (map-equiv e (zero-Fin k)) +is-equivalence-injective-Fin {succ-ℕ k} {succ-ℕ l} e = + ap succ-ℕ (is-equivalence-injective-Fin (equiv-equiv-Maybe e)) abstract is-injective-Fin : is-injective Fin is-injective-Fin = is-injective-is-equivalence-injective is-equivalence-injective-Fin + +compute-is-equivalence-injective-Fin-id-equiv : + {n : ℕ} → is-equivalence-injective-Fin {n} {n} id-equiv = refl +compute-is-equivalence-injective-Fin-id-equiv {zero-ℕ} = refl +compute-is-equivalence-injective-Fin-id-equiv {succ-ℕ n} = + ap² succ-ℕ + ( ( ap is-equivalence-injective-Fin compute-equiv-equiv-Maybe-id-equiv) ∙ + ( compute-is-equivalence-injective-Fin-id-equiv {n})) +``` + +### `Fin` is a preunivalent type family + +The proof does not rely on the (pre-)univalence axiom. + +```agda +is-section-on-diagonal-is-equivalence-injective-Fin : + {n : ℕ} → + equiv-tr Fin (is-equivalence-injective-Fin {n} {n} id-equiv) = id-equiv +is-section-on-diagonal-is-equivalence-injective-Fin = + ap (equiv-tr Fin) compute-is-equivalence-injective-Fin-id-equiv + +is-retraction-is-equivalence-injective-Fin : + {n m : ℕ} → + is-retraction (equiv-tr Fin) (is-equivalence-injective-Fin {n} {m}) +is-retraction-is-equivalence-injective-Fin refl = + compute-is-equivalence-injective-Fin-id-equiv + +retraction-equiv-tr-Fin : (n m : ℕ) → retraction (equiv-tr Fin {n} {m}) +pr1 (retraction-equiv-tr-Fin n m) = is-equivalence-injective-Fin +pr2 (retraction-equiv-tr-Fin n m) = is-retraction-is-equivalence-injective-Fin + +is-preunivalent-Fin : is-preunivalent Fin +is-preunivalent-Fin = + is-preunivalent-retraction-equiv-tr-Set Fin-Set retraction-equiv-tr-Fin ```