# Equivalence extensionality
```agda
module foundation.equivalence-extensionality where
```
<details><summary>Imports</summary>
```agda
open import foundation.dependent-pair-types
open import foundation.dependent-universal-property-equivalences
open import foundation.function-extensionality
open import foundation.fundamental-theorem-of-identity-types
open import foundation.identity-systems
open import foundation.subtype-identity-principle
open import foundation.universe-levels
open import foundation-core.contractible-maps
open import foundation-core.contractible-types
open import foundation-core.equivalences
open import foundation-core.fibers-of-maps
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
open import foundation-core.propositions
open import foundation-core.sections
open import foundation-core.torsorial-type-families
open import foundation-core.type-theoretic-principle-of-choice
```
</details>
## Characterizing the identity type of equivalences
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
where
htpy-equiv : A ≃ B → A ≃ B → UU (l1 ⊔ l2)
htpy-equiv e e' = (map-equiv e) ~ (map-equiv e')
_~e_ = htpy-equiv
extensionality-equiv : (f g : A ≃ B) → (f = g) ≃ htpy-equiv f g
extensionality-equiv f =
extensionality-type-subtype
( is-equiv-Prop)
( pr2 f)
( refl-htpy' (pr1 f))
( λ g → equiv-funext)
where
is-equiv-Prop : (f : A → B) → Prop (l1 ⊔ l2)
pr1 (is-equiv-Prop f) = is-equiv f
pr2 (is-equiv-Prop f) H =
is-prop-is-contr
( is-contr-product
( is-contr-equiv'
( (b : B) → fiber f b)
( distributive-Π-Σ)
( is-contr-Π (is-contr-map-is-equiv H)))
( is-contr-is-equiv'
( Σ (B → A) (λ h → (h ∘ f) = id))
( tot (λ h → htpy-eq))
( is-equiv-tot-is-fiberwise-equiv
( λ h → funext (h ∘ f) id))
( is-contr-map-is-equiv
( is-equiv-precomp-Π-is-equiv H (λ y → A))
( id))))
( H)
abstract
is-torsorial-htpy-equiv :
(e : A ≃ B) → is-torsorial (htpy-equiv e)
is-torsorial-htpy-equiv e =
fundamental-theorem-id'
( map-equiv ∘ extensionality-equiv e)
( is-equiv-map-equiv ∘ extensionality-equiv e)
refl-htpy-equiv : (e : A ≃ B) → htpy-equiv e e
refl-htpy-equiv e = refl-htpy
eq-htpy-equiv : {e e' : A ≃ B} → htpy-equiv e e' → e = e'
eq-htpy-equiv {e} {e'} = map-inv-equiv (extensionality-equiv e e')
htpy-eq-equiv : {e e' : A ≃ B} → e = e' → htpy-equiv e e'
htpy-eq-equiv {e} {e'} = map-equiv (extensionality-equiv e e')
htpy-eq-map-equiv :
{e e' : A ≃ B} → (map-equiv e) = (map-equiv e') → htpy-equiv e e'
htpy-eq-map-equiv = htpy-eq
```
### Homotopy induction for homotopies between equivalences
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
where
abstract
induction-principle-htpy-equiv :
{l3 : Level} (e : A ≃ B)
(P : (e' : A ≃ B) (H : htpy-equiv e e') → UU l3) →
section
( λ (h : (e' : A ≃ B) (H : htpy-equiv e e') → P e' H) →
h e (refl-htpy-equiv e))
induction-principle-htpy-equiv e =
is-identity-system-is-torsorial e
( refl-htpy-equiv e)
( is-torsorial-htpy-equiv e)
ind-htpy-equiv :
{l3 : Level} (e : A ≃ B) (P : (e' : A ≃ B) (H : htpy-equiv e e') → UU l3) →
P e (refl-htpy-equiv e) → (e' : A ≃ B) (H : htpy-equiv e e') → P e' H
ind-htpy-equiv e P = pr1 (induction-principle-htpy-equiv e P)
compute-ind-htpy-equiv :
{l3 : Level} (e : A ≃ B) (P : (e' : A ≃ B) (H : htpy-equiv e e') → UU l3)
(p : P e (refl-htpy-equiv e)) →
ind-htpy-equiv e P p e (refl-htpy-equiv e) = p
compute-ind-htpy-equiv e P = pr2 (induction-principle-htpy-equiv e P)
```