Properties of equivalences depending on function extensionality. (Not included in UF.Equiv because the module UF.funext defines function extensionality as the equivalence of happly for suitable parameters.) \begin{code} {-# OPTIONS --without-K --exact-split --safe --auto-inline #-} module UF.Equiv-FunExt where open import MLTT.Spartan open import UF.Base open import UF.Subsingletons open import UF.Subsingletons-FunExt open import UF.Retracts open import UF.FunExt open import UF.Equiv open import UF.EquivalenceExamples being-vv-equiv-is-prop' : funext 𝓥 (𝓤 ⊔ 𝓥) → funext (𝓤 ⊔ 𝓥) (𝓤 ⊔ 𝓥) → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) → is-prop (is-vv-equiv f) being-vv-equiv-is-prop' {𝓤} {𝓥} fe fe' f = Π-is-prop fe (λ x → being-singleton-is-prop fe' ) being-vv-equiv-is-prop : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) → is-prop (is-vv-equiv f) being-vv-equiv-is-prop {𝓤} {𝓥} fe = being-vv-equiv-is-prop' (fe 𝓥 (𝓤 ⊔ 𝓥)) (fe (𝓤 ⊔ 𝓥) (𝓤 ⊔ 𝓥)) qinv-post' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } → naive-funext 𝓦 𝓤 → naive-funext 𝓦 𝓥 → (f : X → Y) → qinv f → qinv (λ (h : A → X) → f ∘ h) qinv-post' {𝓤} {𝓥} {𝓦} {X} {Y} {A} nfe nfe' f (g , η , ε) = (g' , η' , ε') where f' : (A → X) → (A → Y) f' h = f ∘ h g' : (A → Y) → (A → X) g' k = g ∘ k η' : (h : A → X) → g' (f' h) = h η' h = nfe (η ∘ h) ε' : (k : A → Y) → f' (g' k) = k ε' k = nfe' (ε ∘ k) qinv-post : (∀ 𝓤 𝓥 → naive-funext 𝓤 𝓥) → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } (f : X → Y) → qinv f → qinv (λ (h : A → X) → f ∘ h) qinv-post {𝓤} {𝓥} {𝓦} nfe = qinv-post' (nfe 𝓦 𝓤) (nfe 𝓦 𝓥) equiv-post : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } → naive-funext 𝓦 𝓤 → naive-funext 𝓦 𝓥 → (f : X → Y) → is-equiv f → is-equiv (λ (h : A → X) → f ∘ h) equiv-post nfe nfe' f e = qinvs-are-equivs (λ h → f ∘ h) (qinv-post' nfe nfe' f (equivs-are-qinvs f e)) qinv-pre' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } → naive-funext 𝓥 𝓦 → naive-funext 𝓤 𝓦 → (f : X → Y) → qinv f → qinv (λ (h : Y → A) → h ∘ f) qinv-pre' {𝓤} {𝓥} {𝓦} {X} {Y} {A} nfe nfe' f (g , η , ε) = (g' , η' , ε') where f' : (Y → A) → (X → A) f' h = h ∘ f g' : (X → A) → (Y → A) g' k = k ∘ g η' : (h : Y → A) → g' (f' h) = h η' h = nfe (λ y → ap h (ε y)) ε' : (k : X → A) → f' (g' k) = k ε' k = nfe' (λ x → ap k (η x)) qinv-pre : (∀ 𝓤 𝓥 → naive-funext 𝓤 𝓥) → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } (f : X → Y) → qinv f → qinv (λ (h : Y → A) → h ∘ f) qinv-pre {𝓤} {𝓥} {𝓦} nfe = qinv-pre' (nfe 𝓥 𝓦) (nfe 𝓤 𝓦) retractions-have-at-most-one-section' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → funext 𝓥 𝓤 → funext 𝓥 𝓥 → (f : X → Y) → is-section f → is-prop (has-section f) retractions-have-at-most-one-section' {𝓤} {𝓥} {X} {Y} fe fe' f (g , gf) (h , fh) = singletons-are-props c (h , fh) where a : qinv f a = equivs-are-qinvs f ((h , fh) , g , gf) b : is-singleton(fiber (λ h → f ∘ h) id) b = qinvs-are-vv-equivs (λ h → f ∘ h) (qinv-post' (dfunext fe) (dfunext fe') f a) id r : fiber (λ h → f ∘ h) id → has-section f r (h , p) = (h , happly' (f ∘ h) id p) s : has-section f → fiber (λ h → f ∘ h) id s (h , η) = (h , dfunext fe' η) rs : (σ : has-section f) → r (s σ) = σ rs (h , η) = ap (λ - → (h , -)) q where q : happly' (f ∘ h) id (dfunext fe' η) = η q = happly-funext fe' (f ∘ h) id η c : is-singleton (has-section f) c = retract-of-singleton (r , s , rs) b sections-have-at-most-one-retraction' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → funext 𝓤 𝓤 → funext 𝓥 𝓤 → (f : X → Y) → has-section f → is-prop (is-section f) sections-have-at-most-one-retraction' {𝓤} {𝓥} {X} {Y} fe fe' f (g , fg) (h , hf) = singletons-are-props c (h , hf) where a : qinv f a = equivs-are-qinvs f ((g , fg) , (h , hf)) b : is-singleton(fiber (λ h → h ∘ f) id) b = qinvs-are-vv-equivs (λ h → h ∘ f) (qinv-pre' (dfunext fe') (dfunext fe) f a) id r : fiber (λ h → h ∘ f) id → is-section f r (h , p) = (h , happly' (h ∘ f) id p) s : is-section f → fiber (λ h → h ∘ f) id s (h , η) = (h , dfunext fe η) rs : (σ : is-section f) → r (s σ) = σ rs (h , η) = ap (λ - → (h , -)) q where q : happly' (h ∘ f) id (dfunext fe η) = η q = happly-funext fe (h ∘ f) id η c : is-singleton (is-section f) c = retract-of-singleton (r , s , rs) b retractions-have-at-most-one-section : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) → is-section f → is-prop (has-section f) retractions-have-at-most-one-section {𝓤} {𝓥} fe = retractions-have-at-most-one-section' (fe 𝓥 𝓤) (fe 𝓥 𝓥) sections-have-at-most-one-retraction : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) → has-section f → is-prop (is-section f) sections-have-at-most-one-retraction {𝓤} {𝓥} fe = sections-have-at-most-one-retraction' (fe 𝓤 𝓤) (fe 𝓥 𝓤) being-equiv-is-prop' : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → funext 𝓥 𝓤 → funext 𝓥 𝓥 → funext 𝓤 𝓤 → funext 𝓥 𝓤 → (f : X → Y) → is-prop (is-equiv f) being-equiv-is-prop' fe fe' fe'' fe''' f = ×-prop-criterion (retractions-have-at-most-one-section' fe fe' f , sections-have-at-most-one-retraction' fe'' fe''' f) being-equiv-is-prop : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X → Y) → is-prop (is-equiv f) being-equiv-is-prop {𝓤} {𝓥} fe f = being-equiv-is-prop' (fe 𝓥 𝓤) (fe 𝓥 𝓥) (fe 𝓤 𝓤) (fe 𝓥 𝓤) f being-equiv-is-prop'' : {X Y : 𝓤 ̇ } → funext 𝓤 𝓤 → (f : X → Y) → is-prop (is-equiv f) being-equiv-is-prop'' fe = being-equiv-is-prop' fe fe fe fe ≃-assoc' : funext 𝓣 𝓤 → funext 𝓣 𝓣 → funext 𝓤 𝓤 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } {T : 𝓣 ̇ } (α : X ≃ Y) (β : Y ≃ Z) (γ : Z ≃ T) → α ● (β ● γ) = (α ● β) ● γ ≃-assoc' fe₀ f₁ f₂ (f , a) (g , b) (h , c) = to-Σ-= (p , q) where p : (h ∘ g) ∘ f = h ∘ (g ∘ f) p = refl d e : is-equiv (h ∘ g ∘ f) d = ∘-is-equiv a (∘-is-equiv b c) e = ∘-is-equiv (∘-is-equiv a b) c q : transport is-equiv p d = e q = being-equiv-is-prop' fe₀ f₁ f₂ fe₀ (h ∘ g ∘ f) _ _ ≃-assoc : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } {T : 𝓣 ̇ } (α : X ≃ Y) (β : Y ≃ Z) (γ : Z ≃ T) → α ● (β ● γ) = (α ● β) ● γ ≃-assoc fe = ≃-assoc' (fe _ _) (fe _ _) (fe _ _) \end{code} The above proof can be condensed to one line in the style of the following two proofs, which exploit the fact that the identity map is a neutral element for ordinary function composition, definitionally: \begin{code} ≃-refl-left' : funext 𝓥 𝓤 → funext 𝓥 𝓥 → funext 𝓤 𝓤 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → ≃-refl X ● α = α ≃-refl-left' fe₀ fe₁ fe₂ α = to-Σ-=' (being-equiv-is-prop' fe₀ fe₁ fe₂ fe₀ _ _ _) ≃-refl-right' : funext 𝓥 𝓤 → funext 𝓥 𝓥 → funext 𝓤 𝓤 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → α ● ≃-refl Y = α ≃-refl-right' fe₀ fe₁ fe₂ α = to-Σ-=' (being-equiv-is-prop' fe₀ fe₁ fe₂ fe₀ _ _ _) ≃-sym-involutive' : funext 𝓥 𝓤 → funext 𝓥 𝓥 → funext 𝓤 𝓤 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → ≃-sym (≃-sym α) = α ≃-sym-involutive' fe₀ fe₁ fe₂ (f , a) = to-Σ-= (inversion-involutive f a , being-equiv-is-prop' fe₀ fe₁ fe₂ fe₀ f _ a) ≃-Sym' : funext 𝓥 𝓤 → funext 𝓥 𝓥 → funext 𝓤 𝓤 → funext 𝓤 𝓥 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → (X ≃ Y) ≃ (Y ≃ X) ≃-Sym' fe₀ fe₁ fe₂ fe₃ = qinveq ≃-sym (≃-sym , ≃-sym-involutive' fe₀ fe₁ fe₂ , ≃-sym-involutive' fe₃ fe₂ fe₁) ≃-Sym'' : funext 𝓤 𝓤 → {X Y : 𝓤 ̇ } → (X ≃ Y) ≃ (Y ≃ X) ≃-Sym'' fe = ≃-Sym' fe fe fe fe ≃-Sym : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → (X ≃ Y) ≃ (Y ≃ X) ≃-Sym {𝓤} {𝓥} fe = ≃-Sym' (fe 𝓥 𝓤) (fe 𝓥 𝓥) (fe 𝓤 𝓤) (fe 𝓤 𝓥) ≃-refl-left : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → ≃-refl X ● α = α ≃-refl-left fe = ≃-refl-left' (fe _ _) (fe _ _) (fe _ _) ≃-refl-right : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → α ● ≃-refl Y = α ≃-refl-right fe = ≃-refl-right' (fe _ _) (fe _ _) (fe _ _) ≃-sym-involutive : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → ≃-sym (≃-sym α) = α ≃-sym-involutive {𝓤} {𝓥} fe = ≃-sym-involutive' (fe 𝓥 𝓤) (fe 𝓥 𝓥) (fe 𝓤 𝓤) ≃-sym-left-inverse' : funext 𝓥 𝓥 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → ≃-sym α ● α = ≃-refl Y ≃-sym-left-inverse' {𝓤} {𝓥} fe (f , e) = to-Σ-= (p , being-equiv-is-prop' fe fe fe fe _ _ _) where p : f ∘ inverse f e = id p = dfunext fe (inverses-are-sections f e) ≃-sym-left-inverse : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → ≃-sym α ● α = ≃-refl Y ≃-sym-left-inverse fe = ≃-sym-left-inverse' (fe _ _) ≃-sym-right-inverse' : funext 𝓤 𝓤 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → α ● ≃-sym α = ≃-refl X ≃-sym-right-inverse' {𝓤} {𝓥} fe (f , e) = to-Σ-= (p , being-equiv-is-prop' fe fe fe fe _ _ _) where p : inverse f e ∘ f = id p = dfunext fe (inverses-are-retractions f e) ≃-sym-right-inverse : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (α : X ≃ Y) → α ● ≃-sym α = ≃-refl X ≃-sym-right-inverse fe = ≃-sym-right-inverse' (fe _ _) ≃-cong-left' : {𝓤 𝓥 𝓦 : Universe} → funext 𝓦 𝓤 → funext 𝓦 𝓦 → funext 𝓤 𝓤 → funext 𝓦 𝓥 → funext 𝓥 𝓥 → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } → X ≃ Y → (X ≃ Z) ≃ (Y ≃ Z) ≃-cong-left' {𝓤} {𝓥} {𝓦} fe₀ fe₁ fe₂ fe₃ fe₄ α = qinveq ((≃-sym α) ●_) ((α ●_), p , q) where p = λ γ → α ● (≃-sym α ● γ) =⟨ ≃-assoc' fe₀ fe₁ fe₂ α (≃-sym α) γ ⟩ (α ● ≃-sym α) ● γ =⟨ ap (_● γ) (≃-sym-right-inverse' fe₂ α) ⟩ ≃-refl _ ● γ =⟨ ≃-refl-left' fe₀ fe₁ fe₂ _ ⟩ γ ∎ q = λ β → ≃-sym α ● (α ● β) =⟨ ≃-assoc' fe₃ fe₁ fe₄ (≃-sym α) α β ⟩ (≃-sym α ● α) ● β =⟨ ap (_● β) (≃-sym-left-inverse' fe₄ α) ⟩ ≃-refl _ ● β =⟨ ≃-refl-left' fe₃ fe₁ fe₄ _ ⟩ β ∎ ≃-cong-left : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {Z : 𝓦 ̇ } → X ≃ Y → (X ≃ Z) ≃ (Y ≃ Z) ≃-cong-left fe = ≃-cong-left' (fe _ _) (fe _ _) (fe _ _) (fe _ _) (fe _ _) ≃-cong-right : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } → X ≃ Y → (A ≃ X) ≃ (A ≃ Y) ≃-cong-right fe {X} {Y} {A} α = (A ≃ X) ≃⟨ ≃-Sym fe ⟩ (X ≃ A) ≃⟨ ≃-cong-left fe α ⟩ (Y ≃ A) ≃⟨ ≃-Sym fe ⟩ (A ≃ Y) ■ ≃-cong : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } {B : 𝓣 ̇ } → X ≃ A → Y ≃ B → (X ≃ Y) ≃ (A ≃ B) ≃-cong fe {X} {Y} {A} {B} α β = (X ≃ Y) ≃⟨ ≃-cong-left fe α ⟩ (A ≃ Y) ≃⟨ ≃-cong-right fe β ⟩ (A ≃ B) ■ ≃-is-prop : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → is-prop Y → is-prop (X ≃ Y) ≃-is-prop {𝓤} {𝓥} fe i (f , e) (f' , e') = to-subtype-= (being-equiv-is-prop fe) (dfunext (fe 𝓤 𝓥) (λ x → i (f x) (f' x))) ≃-is-prop' : FunExt → {X : 𝓤 ̇ } {Y : 𝓥 ̇ } → is-prop X → is-prop (X ≃ Y) ≃-is-prop' fe i = equiv-to-prop (≃-Sym fe) (≃-is-prop fe i) \end{code} Propositional and functional extesionality give univalence for propositions. Notice that P is assumed to be a proposition, but X ranges over arbitrary types: \begin{code} propext-funext-give-prop-ua : propext 𝓤 → funext 𝓤 𝓤 → (X : 𝓤 ̇ ) (P : 𝓤 ̇ ) → is-prop P → is-equiv (idtoeq X P) propext-funext-give-prop-ua {𝓤} pe fe X P i = (eqtoid , η) , (eqtoid , ε) where l : X ≃ P → is-prop X l e = equiv-to-prop e i eqtoid : X ≃ P → X = P eqtoid (f , (r , rf) , h) = pe (l (f , (r , rf) , h)) i f r m : is-prop (X ≃ P) m (f , e) (f' , e') = to-Σ-= (dfunext fe (λ x → i (f x) (f' x)) , being-equiv-is-prop'' fe f' _ e') η : (e : X ≃ P) → idtoeq X P (eqtoid e) = e η e = m (idtoeq X P (eqtoid e)) e ε : (q : X = P) → eqtoid (idtoeq X P q) = q ε q = identifications-of-props-are-props pe fe P i X (eqtoid (idtoeq X P q)) q prop-univalent-≃ : propext 𝓤 → funext 𝓤 𝓤 → (X P : 𝓤 ̇ ) → is-prop P → (X = P) ≃ (X ≃ P) prop-univalent-≃ pe fe X P i = idtoeq X P , propext-funext-give-prop-ua pe fe X P i prop-univalent-≃' : propext 𝓤 → funext 𝓤 𝓤 → (X P : 𝓤 ̇ ) → is-prop P → (P = X) ≃ (P ≃ X) prop-univalent-≃' pe fe X P i = (P = X) ≃⟨ =-flip ⟩ (X = P) ≃⟨ prop-univalent-≃ pe fe X P i ⟩ (X ≃ P) ≃⟨ ≃-Sym'' fe ⟩ (P ≃ X) ■ \end{code} The so-called type-theoretic axiom of choice (already defined in MLTT.Spartan with another name - TODO): \begin{code} TT-choice : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : (x : X) → Y x → 𝓦 ̇ } → (Π x ꞉ X , Σ y ꞉ Y x , A x y) → Σ f ꞉ ((x : X) → Y x) , Π x ꞉ X , A x (f x) TT-choice φ = (λ x → pr₁(φ x)) , (λ x → pr₂(φ x)) \end{code} Its inverse (also already defined - TODO): \begin{code} TT-unchoice : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : (x : X) → Y x → 𝓦 ̇ } → (Σ f ꞉ ((x : X) → Y x) , Π x ꞉ X , A x (f x)) → Π x ꞉ X , Σ y ꞉ Y x , A x y TT-unchoice (f , g) x = (f x) , (g x) \end{code} The proof that they are mutually inverse, where one direction requires function extensionality (this already occurs in UF.EquivalenceExamples - TODO): \begin{code} TT-choice-unchoice : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : (x : X) → Y x → 𝓦 ̇ } → (t : Σ f ꞉ ((x : X) → Y x) , Π x ꞉ X , A x (f x)) → TT-choice (TT-unchoice {𝓤} {𝓥} {𝓦} {X} {Y} {A} t) = t TT-choice-unchoice t = refl TT-choice-has-section : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : (x : X) → Y x → 𝓦 ̇ } → has-section (TT-choice {𝓤} {𝓥} {𝓦} {X} {Y} {A}) TT-choice-has-section {𝓤} {𝓥} {𝓦} {X} {Y} {A} = TT-unchoice , TT-choice-unchoice {𝓤} {𝓥} {𝓦} {X} {Y} {A} TT-unchoice-choice : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : (x : X) → Y x → 𝓦 ̇ } → funext 𝓤 (𝓥 ⊔ 𝓦) → (φ : Π x ꞉ X , Σ y ꞉ Y x , A x y) → TT-unchoice (TT-choice φ) = φ TT-unchoice-choice fe φ = dfunext fe (λ x → refl) TT-choice-is-equiv : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : (x : X) → Y x → 𝓦 ̇ } → funext 𝓤 (𝓥 ⊔ 𝓦) → is-equiv TT-choice TT-choice-is-equiv {𝓤} {𝓥} {𝓦} {X} {Y} {A} fe = TT-choice-has-section {𝓤} {𝓥} {𝓦} {X} {Y} {A} , TT-unchoice , TT-unchoice-choice fe TT-unchoice-is-equiv : {X : 𝓤 ̇ } {Y : X → 𝓥 ̇ } {A : (x : X) → Y x → 𝓦 ̇ } → funext 𝓤 (𝓥 ⊔ 𝓦) → is-equiv TT-unchoice TT-unchoice-is-equiv {𝓤} {𝓥} {𝓦} {X} {Y} {A} fe = (TT-choice , TT-unchoice-choice {𝓤} {𝓥} {𝓦} {X} {Y} {A} fe) , (TT-choice , TT-choice-unchoice {𝓤} {𝓥} {𝓦} {X} {Y} {A}) \end{code}