Jonathan Sterling, started 22 March, 2023. Based on Egbert Rijke's "Introduction to Homotopy Type Theory". \begin{code} {-# OPTIONS --safe --without-K #-} module UF.IdentitySystems where open import MLTT.Spartan open import UF.Base open import UF.Embeddings open import UF.Equiv open import UF.FunExt open import UF.Retracts open import UF.Subsingletons open import UF.PairFun as PairFun record Has-Id-Sys {𝓦} (A : 𝓤 ̇ ) (a : A) (fam : A → 𝓦 ̇) : 𝓤ω where field ctr : fam a ind : {𝓥 : Universe} (P : (x : A) (q : fam x) → 𝓥 ̇) (p : P a ctr) (x : A) (q : fam x) → P x q ind-β : {𝓥 : Universe} (P : (x : A) (q : fam x) → 𝓥 ̇) (p : P a ctr) → ind P p a ctr = p to-= : (x : A) → fam x → a = x to-= = ind _ refl from-= : (x : A) → a = x → fam x from-= x refl = ctr to-=-is-equiv : (x : A) → is-equiv (to-= x) pr₁ (pr₁ (to-=-is-equiv x)) = from-= x pr₂ (pr₁ (to-=-is-equiv x)) refl = ind-β _ _ pr₁ (pr₂ (to-=-is-equiv x)) = from-= x pr₂ (pr₂ (to-=-is-equiv x)) q = aux x q where aux : (x : A) (q : fam x) → from-= x (to-= x q) = q aux = ind _ (ap (from-= a) (ind-β _ _)) record Id-Sys 𝓦 (A : 𝓤 ̇ ) (a : A) : 𝓤ω where field fam : A → 𝓦 ̇ sys : Has-Id-Sys A a fam open Has-Id-Sys sys public Unbiased-Id-Sys : Universe → 𝓤 ̇ → 𝓤ω Unbiased-Id-Sys 𝓦 A = (a : A) → Id-Sys 𝓦 A a module from-path-characterization {A : 𝓤 ̇ } (Q : A → A → 𝓤 ̇ ) (H : {x y : A} → (x = y) ≃ Q x y) (a : A) where open Id-Sys open Has-Id-Sys private Q-refl : {x : A} → Q x x Q-refl = eqtofun H refl aux : (P : (x : A) (q : Q a x) → 𝓥 ̇ ) → (p : P a Q-refl) → (x : A) → (q : a = x) → P x (eqtofun H q) aux P p x refl = p id-sys : Id-Sys 𝓤 A a fam id-sys = Q a ctr (sys id-sys) = Q-refl ind (sys id-sys) P p x q = transport (P x) (inverses-are-sections _ (eqtofun- H) q) (aux P p x (back-eqtofun H q)) ind-β (sys id-sys) P p = ap gen (Aux-is-prop (back-eqtofun H Q-refl , inverses-are-sections _ (eqtofun- H) Q-refl) (refl , refl)) where Aux = Σ ϕ ꞉ a = a , eqtofun H ϕ = Q-refl Aux-singl : singleton-type' refl ≃ Aux Aux-singl = pair-fun-equiv (≃-refl (a = a)) λ ϕ → ap (eqtofun H) , embedding-gives-embedding' _ (equivs-are-embeddings _ (eqtofun- H)) ϕ refl Aux-is-prop : is-prop Aux Aux-is-prop = retract-of-prop (≃-gives-◁ (≃-sym Aux-singl)) (singleton-types'-are-props refl) gen : Aux → P a Q-refl gen (ϕ , ψ ) = transport (P a) ψ (aux P p a ϕ) module _ 𝓦 𝓦' (A : 𝓤 ̇ ) (B : A → 𝓥 ̇ ) where record Dep-Id-Sys {a : A} ([a] : Id-Sys 𝓦 A a) (b : B a) : 𝓤ω where private module [a] = Id-Sys [a] field fam : (x : A) (q : [a].fam x) (y : B x) → 𝓦' ̇ sys : Has-Id-Sys (B a) b (fam a [a].ctr) open Has-Id-Sys sys public module _ {A : 𝓤 ̇ } {B : A → 𝓥 ̇ } {a : A} {b : B a} ([a] : Id-Sys 𝓦 A a) ([b] : Dep-Id-Sys 𝓦 𝓦' A B [a] b) where module [a] = Id-Sys [a] module [b] = Dep-Id-Sys [b] open Id-Sys open Has-Id-Sys pair-id-sys : Id-Sys (𝓦 ⊔ 𝓦') (Σ B) (a , b) fam pair-id-sys (x , y) = Σ ϕ ꞉ [a].fam x , [b].fam x ϕ y pr₁ (ctr (sys pair-id-sys)) = [a].ctr pr₂ (ctr (sys pair-id-sys)) = [b].ctr ind (sys pair-id-sys) P p = λ (x , y) (ϕ , ψ) → aux x ϕ y ψ where aux : (x : A) (ϕ : [a].fam x) (y : B x) (ψ : [b].fam x ϕ y) → P (x , y) (ϕ , ψ) aux = [a].ind _ ([b].ind _ p) ind-β (sys pair-id-sys) P p = happly (happly ([a].ind-β _ _) b) [b].ctr ∙ [b].ind-β _ _ module _ (A : 𝓤 ̇ ) where open Id-Sys open Has-Id-Sys =-id-sys : Unbiased-Id-Sys 𝓤 A fam (=-id-sys a) = a =_ ctr (sys (=-id-sys a)) = refl ind (sys (=-id-sys a)) P p x refl = p ind-β (sys (=-id-sys a)) _ _ = refl module _ (fe : funext 𝓤 𝓥) {A : 𝓤 ̇ } {B : 𝓥 ̇ } (f : A → B) where homotopy-id-sys : Id-Sys (𝓤 ⊔ 𝓥) (A → B) f homotopy-id-sys = from-path-characterization.id-sys _∼_ (happly-≃ fe) f \end{code}