# Weak function extensionality ```agda module foundation.weak-function-extensionality where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.decidable-equality open import foundation.decidable-types open import foundation.dependent-pair-types open import foundation.function-extensionality open import foundation.fundamental-theorem-of-identity-types open import foundation.universe-levels open import foundation-core.contractible-types open import foundation-core.coproduct-types open import foundation-core.empty-types open import foundation-core.equality-dependent-pair-types open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.identity-types open import foundation-core.propositions open import foundation-core.torsorial-type-families ``` </details> ## Idea **Weak function extensionality** is the principle that any dependent product of [contractible types](foundation-core.contractible-types.md) is contractible. This principle is [equivalent](foundation-core.equivalences.md) to [the function extensionality axiom](foundation.function-extensionality.md). ## Definition ### Weak function extensionality ```agda instance-weak-function-extensionality : {l1 l2 : Level} (A : UU l1) (B : A → UU l2) → UU (l1 ⊔ l2) instance-weak-function-extensionality A B = ((x : A) → is-contr (B x)) → is-contr ((x : A) → B x) weak-function-extensionality-Level : (l1 l2 : Level) → UU (lsuc l1 ⊔ lsuc l2) weak-function-extensionality-Level l1 l2 = (A : UU l1) (B : A → UU l2) → instance-weak-function-extensionality A B weak-function-extensionality : UUω weak-function-extensionality = {l1 l2 : Level} → weak-function-extensionality-Level l1 l2 ``` ### Weaker function extensionality ```agda instance-weaker-function-extensionality : {l1 l2 : Level} (A : UU l1) (B : A → UU l2) → UU (l1 ⊔ l2) instance-weaker-function-extensionality A B = ((x : A) → is-prop (B x)) → is-prop ((x : A) → B x) weaker-function-extensionality-Level : (l1 l2 : Level) → UU (lsuc l1 ⊔ lsuc l2) weaker-function-extensionality-Level l1 l2 = (A : UU l1) (B : A → UU l2) → instance-weaker-function-extensionality A B weaker-function-extensionality : UUω weaker-function-extensionality = {l1 l2 : Level} → weaker-function-extensionality-Level l1 l2 ``` ## Properties ### Weak function extensionality is logically equivalent to function extensionality ```agda abstract weak-funext-funext : {l1 l2 : Level} → function-extensionality-Level l1 l2 → weak-function-extensionality-Level l1 l2 pr1 (weak-funext-funext funext A B is-contr-B) x = center (is-contr-B x) pr2 (weak-funext-funext funext A B is-contr-B) f = map-inv-is-equiv ( funext (λ x → center (is-contr-B x)) f) ( λ x → contraction (is-contr-B x) (f x)) abstract funext-weak-funext : {l1 l2 : Level} → weak-function-extensionality-Level l1 l2 → function-extensionality-Level l1 l2 funext-weak-funext weak-funext {A = A} {B} f = fundamental-theorem-id ( is-contr-retract-of ( (x : A) → Σ (B x) (λ b → f x = b)) ( ( λ t x → (pr1 t x , pr2 t x)) , ( λ t → (pr1 ∘ t , pr2 ∘ t)) , ( λ t → eq-pair-eq-fiber refl)) ( weak-funext A ( λ x → Σ (B x) (λ b → f x = b)) ( λ x → is-torsorial-Id (f x)))) ( λ g → htpy-eq {g = g}) ``` ### A partial converse to weak function extensionality ```agda module _ {l1 l2 : Level} {I : UU l1} {A : I → UU l2} (d : has-decidable-equality I) (H : is-contr ((i : I) → A i)) where cases-function-converse-weak-funext : (i : I) (x : A i) (j : I) (e : is-decidable (i = j)) → A j cases-function-converse-weak-funext i x .i (inl refl) = x cases-function-converse-weak-funext i x j (inr f) = center H j function-converse-weak-funext : (i : I) (x : A i) (j : I) → A j function-converse-weak-funext i x j = cases-function-converse-weak-funext i x j (d i j) cases-eq-function-converse-weak-funext : (i : I) (x : A i) (e : is-decidable (i = i)) → cases-function-converse-weak-funext i x i e = x cases-eq-function-converse-weak-funext i x (inl p) = ap ( λ t → cases-function-converse-weak-funext i x i (inl t)) ( eq-is-prop ( is-set-has-decidable-equality d i i) { p} { refl}) cases-eq-function-converse-weak-funext i x (inr f) = ex-falso (f refl) eq-function-converse-weak-funext : (i : I) (x : A i) → function-converse-weak-funext i x i = x eq-function-converse-weak-funext i x = cases-eq-function-converse-weak-funext i x (d i i) converse-weak-funext : (i : I) → is-contr (A i) pr1 (converse-weak-funext i) = center H i pr2 (converse-weak-funext i) y = ( htpy-eq ( contraction H (function-converse-weak-funext i y)) ( i)) ∙ ( eq-function-converse-weak-funext i y) ``` ### Weaker function extensionality implies weak function extensionality ```agda weak-funext-weaker-funext : {l1 l2 : Level} {A : UU l1} {B : A → UU l2} → instance-weaker-function-extensionality A B → instance-weak-function-extensionality A B weak-funext-weaker-funext H C = is-proof-irrelevant-is-prop ( H (λ x → is-prop-is-contr (C x))) ( λ x → center (C x)) ```