Martin Escardo, 19th May 2018.
Properties of function extensionality.
\begin{code}
{-# OPTIONS --safe --without-K #-}
module UF.FunExt-Properties where
open import MLTT.Spartan
open import UF.Base
open import UF.FunExt
open import UF.Equiv
open import UF.Equiv-FunExt
open import UF.Yoneda
open import UF.Singleton-Properties
open import UF.Subsingletons
open import UF.Retracts
\end{code}
Vladimir Voevodsky proved in Coq that naive function extensionality
(any two pointwise equal non-dependent functions are equal) implies
function extensionality (happly is an equivalence, for dependent
functions):
https://github.com/vladimirias/Foundations/blob/master/Generalities/uu0.v
Here is an Agda version, with explicit indication of the universe levels.
\begin{code}
naive-funext-gives-funext' : naive-funext π€ (π€ β π₯) β naive-funext π€ π€ β funext π€ π₯
naive-funext-gives-funext' {π€} {π₯} nfe nfe' = funext-via-singletons Ξ³
where
Ξ³ : (X : π€ Μ ) (A : X β π₯ Μ )
β ((x : X) β is-singleton (A x))
β is-singleton (Ξ A)
Ξ³ X A Ο = Ξ΄
where
f : Ξ£ A β X
f = prβ
f-is-equiv : is-equiv f
f-is-equiv = prβ-is-equiv X A Ο
g : (X β Ξ£ A) β (X β X)
g h = f β h
g-is-equiv : is-equiv g
g-is-equiv = equiv-post nfe nfe' f f-is-equiv
e : β! h κ (X β Ξ£ A) , f β h οΌ id
e = equivs-are-vv-equivs g g-is-equiv id
r : (Ξ£ h κ (X β Ξ£ A) , f β h οΌ id) β Ξ A
r (h , p) x = transport A (happly p x) (prβ (h x))
s : Ξ A β (Ξ£ h κ (X β Ξ£ A) , f β h οΌ id)
s Ο = (Ξ» x β x , Ο x) , refl
rs : β Ο β r (s Ο) οΌ Ο
rs Ο = refl
Ξ΄ : is-singleton (Ξ A)
Ξ΄ = retract-of-singleton (r , s , rs) e
naive-funext-gives-funext : naive-funext π€ π€ β funext π€ π€
naive-funext-gives-funext fe = naive-funext-gives-funext' fe fe
naive-funext-gives-funextβ : naive-funext π€ π€ β funext π€ π€β
naive-funext-gives-funextβ fe = naive-funext-gives-funext' fe fe
\end{code}
Added by Evan Cavallo on 13th March 2025.
The equivalence extensionality axiom is the restriction of function
extensionality to equivalences. By an argument similar to the proof of function
extensionality from univalence, it implies full function extensionality.
\begin{code}
equivext : β π€ π₯ β π€ βΊ β π₯ βΊ Μ
equivext π€ π₯ =
{X : π€ Μ } {Y : π₯ Μ } (Ξ± Ξ² : X β Y)
β is-equiv (Ξ» (p : Ξ± οΌ Ξ²) β happly (ap β_β p))
equivext-gives-funext : equivext π€ π€ β funext π€ π€
equivext-gives-funext {π€} ee =
funext-via-singletons main
where
promote : (A : π€ Μ ) {X Y : π€ Μ } β X β Y β (A β X) β (A β Y)
promote A Ξ± =
qinveq
(_β Ξ±)
( (_β β-sym Ξ±)
, (Ξ» Ξ² β inverse _ (ee _ _) (inverses-are-retractions _ (prβ Ξ±) β β Ξ² β))
, (Ξ» Ξ³ β inverse _ (ee _ _) (inverses-are-sections _ (prβ Ξ±) β β Ξ³ β)))
module _ (X : π€ Μ ) (Y : X β π€ Μ ) (cY : (x : X) β is-singleton (Y x)) where
Ο : (Ξ£ Y) β X
Ο =
qinveq
prβ
( (Ξ» x β x , prβ (cY x))
, (Ξ» (x , y) β to-Ξ£-οΌ (refl , prβ (cY x) y))
, βΌ-refl)
sec : Ξ Y β fiber β promote X Ο β ππ
sec f =
( qinveq
(Ξ» x β x , f x)
( prβ
, βΌ-refl
, (Ξ» (x , y) β to-Ξ£-οΌ (refl , singletons-are-props (cY x) _ _)))
, inverse _ (ee _ _) βΌ-refl)
ret : fiber β promote X Ο β ππ β Ξ Y
ret (Ξ± , p) x = transport Y (happly (ap β_β p) x) (prβ (prβ Ξ± x))
inv : ret β sec βΌ id
inv f =
ap (Ξ» h β Ξ» x β transport Y (h x) (prβ (prβ Ξ± x))) cancel
where
Ξ± = prβ (sec f)
p = prβ (sec f)
cancel : happly (ap β_β p) οΌ βΌ-refl
cancel = inverses-are-sections _ (ee _ _) (βΌ-refl)
main : is-singleton (Ξ Y)
main = retract-of-singleton
(ret , sec , inv)
(equivs-are-vv-equivs _ (prβ (promote X Ο)) ππ)
\end{code}
End of addition.