Home

関数の外延性

module foundations.function-extensionality where
Imports
open import foundations.universe
open import foundations.identity-type
open import foundations.homotopy
open import foundations.bi-invertible-map
open import foundations.happly
open import foundations.quasi-inverse-to-bi-invertible-map
open import foundations.bi-invertible-map-to-quasi-inverse
open import foundations.quasi-inverse
open import foundations.sigma-type
open import foundations.function
open import foundations.equivalence-is-equivalence-relation
open import foundations.identity-type-respects-equivalence
open import foundations.implicit-function
open import foundations.functions-are-functors

関数の外延性は素のAgdaでは示すことができない。したがって、その型のみ定義しておく。

private variable
   ℓ′ : Level

FunExtType : (A : Type )  (A  Type ℓ′)  Type (  ℓ′)
FunExtType A B =  (f g : (a : A)  B a)  biinv (happly {f = f} {g = g})

FunExtLevel :   ℓ′  Type (lsuc (  ℓ′))
FunExtLevel  ℓ′ =  {A : Type } {B : A  Type ℓ′}  FunExtType A B

FunExtAll : Typeω
FunExtAll =  { ℓ′}  FunExtLevel  ℓ′
module _ {A : Type } {B : A  Type ℓ′} (e : FunExtType A B) where
  byFunExtType : (f g : (a : A)  B a)  f ~ g  f  g
  byFunExtType f g = e f g .fst .fst

  retractByFunExtType : (f g : (a : A)  B a)
     byFunExtType f g  happly ~ idFunction (f  g)
  retractByFunExtType f g = e f g .fst .snd

  sectionByFunExtType : (f g : (a : A)  B a)
     happly  byFunExtType f g ~ idFunction (f ~ g)
  sectionByFunExtType f g = biinv⇒QuasiInv (e f g) .QuasiInv.rinv

  funExtImplicit :  (f g : {a : A}  B a)  (Id ({a : A}  B a) f g)  (∀ (a : A)  f {a = a}  g)
  funExtImplicit f g =
    trans≃
      (ap toExplicitΠ , idRespEquiv toExplicitΠ (sym≃ explicitΠ≃implicitΠ .snd) f g)
      (trans≃ (happly , e _ _) (idFunction _ ,
                                  ((idFunction _ ,  _  refl)) , (idFunction _ ,  _  refl)))))

  byFunExtImplicit : (f g : {a : A}  B a)  (∀ (a : A)  f {a = a}  g)  Id ({a : A}  B a) f g
  byFunExtImplicit f g = funExtImplicit f g .snd .fst .fst