Cory Knapp, 6th June 2018.
This is an alternative version of naive-funext-gives-funext from
UF.FunExt-Properties.lagda (by Martin Escardo, 19th May 2018);
here we split the proof that naive function extensionality into two parts:
1. If post-composition with an equivalence is again an equivalence, then
function extensionality holds;
2. If naive-function extensionality holds, then the antecedent of the
above holds.
Point 2. is already proved in UF.Equiv-Funext.lagda
\begin{code}
{-# OPTIONS --safe --without-K #-}
module UF.FunExt-from-Naive-FunExt 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.Subsingletons
open import UF.Retracts
equiv-post-comp-closure : ∀ 𝓤 𝓦 𝓥 → (𝓤 ⊔ 𝓥 ⊔ 𝓦) ⁺ ̇
equiv-post-comp-closure 𝓤 𝓥 𝓦 = {X : 𝓤 ̇ } {Y : 𝓥 ̇ } {A : 𝓦 ̇ } (f : X → Y)
→ is-equiv f → is-equiv (λ (h : A → X) → f ∘ h)
equiv-post-gives-funext' : equiv-post-comp-closure (𝓤 ⊔ 𝓥) 𝓤 𝓤 → funext 𝓤 𝓥
equiv-post-gives-funext' {𝓤} {𝓥} eqc = funext-via-singletons γ
where
γ : (X : 𝓤 ̇ ) (A : X → 𝓥 ̇ ) → ((x : X) → is-singleton (A x)) → is-singleton (Π A)
γ X A φ = retract-of-singleton (r , s , rs) iss
where
f : Σ A → X
f = pr₁
eqf : is-equiv f
eqf = pr₁-is-equiv X A φ
g : (X → Σ A) → (X → X)
g h = f ∘ h
eqg : is-equiv g
eqg = eqc f eqf
iss : ∃! h ꞉ (X → Σ A), f ∘ h = id
iss = equivs-are-vv-equivs g eqg 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
naive-funext-gives-funext' : naive-funext 𝓤 (𝓤 ⊔ 𝓥) → naive-funext 𝓤 𝓤 → funext 𝓤 𝓥
naive-funext-gives-funext' nfe nfe' = equiv-post-gives-funext' (equiv-post nfe nfe')
naive-funext-gives-funext : naive-funext 𝓤 𝓤 → funext 𝓤 𝓤
naive-funext-gives-funext fe = naive-funext-gives-funext' fe fe
\end{code}