Jon Sterling, started 24th March 2023

Based on the comments of Martín Escardó on the HoTT Mailing List:
https://groups.google.com/g/homotopytypetheory/c/FfiZj1vrkmQ/m/GJETdy0AAgAJ

This module defines a "semistrict" version of the identity type, i.e. one for
which the composition is definitionally associative and unital but for which the
interchange laws are weak.

\begin{code}

{-# OPTIONS --safe --without-K #-}

module UF.SemistrictIdentity where

open import MLTT.Spartan
open import UF.Base
open import UF.Equiv
open import UF.FunExt
open import UF.IdentitySystems

module _ {A : 𝓤 ̇ } where
 _=s_ : (x y : A)  𝓤 ̇
 x =s y = (z : A)  z  x  z  y

 refl-s : {x : A}  x =s x
 refl-s z p = p

 _∙s_ : {x y z : A} (p : x =s y) (q : y =s z)  x =s z
 (p ∙s q) _  = q _  p _
 infixl 10 _∙s_

 module _ {x y : A} (p : x =s y) where
  refl-s-left-unit : refl-s ∙s p  p
  refl-s-left-unit = refl

  refl-s-right-unit : p ∙s refl-s  p
  refl-s-right-unit = refl

 module _ {u v w x : A} (p : u =s v) (q : v =s w) (r : w =s x) where
  ∙s-assoc : p ∙s (q ∙s r)  (p ∙s q) ∙s r
  ∙s-assoc = refl

 module _ {x y : A} where
  to-=s : x  y  x =s y
  to-=s p z q = q  p

  from-=s : x =s y  x  y
  from-=s p = p _ refl

  module _ (fe : funext 𝓤 𝓤) where
   to-=s-is-equiv : is-equiv to-=s
   pr₁ (pr₁ to-=s-is-equiv) = from-=s
   pr₂ (pr₁ to-=s-is-equiv) q =
    dfunext fe λ z 
    dfunext fe (lem z)
    where
     lem : (z : A) (p : z  x)  p  q x refl  q z p
     lem .x refl = refl-left-neutral
   pr₁ (pr₂ to-=s-is-equiv) = from-=s
   pr₂ (pr₂ to-=s-is-equiv) refl = refl

   to-=s-equiv : (x  y)  (x =s y)
   pr₁ to-=s-equiv = to-=s
   pr₂ to-=s-equiv = to-=s-is-equiv

 =s-id-sys : funext 𝓤 𝓤  Unbiased-Id-Sys 𝓤 A
 =s-id-sys fe = from-path-characterization.id-sys _=s_ (to-=s-equiv fe)

\end{code}