# The strictly right unital concatenation operation on identifications ```agda module foundation.strictly-right-unital-concatenation-identifications where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.universe-levels open import foundation-core.identity-types ``` </details> ## Idea The concatenation operation on [identifications](foundation-core.identity-types.md) is a family of binary operations ```text _∙_ : x = y → y = z → x = z ``` indexed by `x y z : A`. However, there are essentially three different ways we can define concatenation of identifications, all with different computational behaviours: 1. We can define concatenation by induction on the equality `x = y`. This gives us the computation rule `refl ∙ q ≐ q`. 2. We can define concatenation by induction on the equality `y = z`. This gives us the computation rule `p ∙ refl ≐ p`. 3. We can define concatenation by induction on both `x = y` and `y = z`. This only gives us the computation rule `refl ∙ refl ≐ refl`. While the third option may be preferred by some for its symmetry, for practical reasons, we prefer one of the first two, and by convention we use the first alternative. However, there are cases where the second case may be preferred. Hence why we on this page consider the {{#concept "strictly right unital concatenation operation on identifications" Agda=_∙ᵣ_ Agda=right-strict-concat Agda=right-strict-concat'}}. This definition is for instance used with the [strictly involutive identity types](foundation.strictly-involutive-identity-types.md) to construct a strictly left unital concatenation operation. ## Definition ```agda module _ {l : Level} {A : UU l} where infixl 15 _∙ᵣ_ _∙ᵣ_ : {x y z : A} → x = y → y = z → x = z p ∙ᵣ refl = p right-strict-concat : {x y : A} → x = y → (z : A) → y = z → x = z right-strict-concat p z q = p ∙ᵣ q right-strict-concat' : (x : A) {y z : A} → y = z → x = y → x = z right-strict-concat' x q p = p ∙ᵣ q ``` ### Translating between the stictly left and stricly right unital versions of concatenation ```agda module _ {l : Level} {A : UU l} where eq-right-strict-concat-concat : {x y z : A} (p : x = y) (q : y = z) → p ∙ q = p ∙ᵣ q eq-right-strict-concat-concat p refl = right-unit eq-concat-right-strict-concat : {x y z : A} (p : x = y) (q : y = z) → p ∙ᵣ q = p ∙ q eq-concat-right-strict-concat p q = inv (eq-right-strict-concat-concat p q) eq-double-right-strict-concat-concat-left-associated : {x y z w : A} (p : x = y) (q : y = z) (r : z = w) → (p ∙ q) ∙ r = (p ∙ᵣ q) ∙ᵣ r eq-double-right-strict-concat-concat-left-associated p q r = ( ap (_∙ r) (eq-right-strict-concat-concat p q)) ∙ ( eq-right-strict-concat-concat (p ∙ᵣ q) r) eq-double-right-strict-concat-concat-right-associated : {x y z w : A} (p : x = y) (q : y = z) (r : z = w) → p ∙ (q ∙ r) = p ∙ᵣ (q ∙ᵣ r) eq-double-right-strict-concat-concat-right-associated p q r = ( ap (p ∙_) (eq-right-strict-concat-concat q r)) ∙ ( eq-right-strict-concat-concat p (q ∙ᵣ r)) eq-double-concat-right-strict-concat-left-associated : {x y z w : A} (p : x = y) (q : y = z) (r : z = w) → (p ∙ᵣ q) ∙ᵣ r = (p ∙ q) ∙ r eq-double-concat-right-strict-concat-left-associated p q r = ( ap (_∙ᵣ r) (eq-concat-right-strict-concat p q)) ∙ ( eq-concat-right-strict-concat (p ∙ q) r) eq-double-concat-right-strict-concat-right-associated : {x y z w : A} (p : x = y) (q : y = z) (r : z = w) → p ∙ᵣ (q ∙ᵣ r) = p ∙ (q ∙ r) eq-double-concat-right-strict-concat-right-associated p q r = ( ap (p ∙ᵣ_) (eq-concat-right-strict-concat q r)) ∙ ( eq-concat-right-strict-concat p (q ∙ r)) ``` ## Properties ### The groupoidal laws ```agda module _ {l : Level} {A : UU l} where assoc-right-strict-concat : {x y z w : A} (p : x = y) (q : y = z) (r : z = w) → ((p ∙ᵣ q) ∙ᵣ r) = (p ∙ᵣ (q ∙ᵣ r)) assoc-right-strict-concat p q refl = refl left-unit-right-strict-concat : {x y : A} {p : x = y} → refl ∙ᵣ p = p left-unit-right-strict-concat {p = refl} = refl right-unit-right-strict-concat : {x y : A} {p : x = y} → p ∙ᵣ refl = p right-unit-right-strict-concat = refl left-inv-right-strict-concat : {x y : A} (p : x = y) → inv p ∙ᵣ p = refl left-inv-right-strict-concat refl = refl right-inv-right-strict-concat : {x y : A} (p : x = y) → p ∙ᵣ inv p = refl right-inv-right-strict-concat refl = refl inv-inv-right-strict-concat : {x y : A} (p : x = y) → inv (inv p) = p inv-inv-right-strict-concat refl = refl distributive-inv-right-strict-concat : {x y : A} (p : x = y) {z : A} (q : y = z) → inv (p ∙ᵣ q) = inv q ∙ᵣ inv p distributive-inv-right-strict-concat refl refl = refl ``` ### Transposing inverses ```agda module _ {l : Level} {A : UU l} where left-transpose-eq-right-strict-concat : {x y : A} (p : x = y) {z : A} (q : y = z) (r : x = z) → p ∙ᵣ q = r → q = inv p ∙ᵣ r left-transpose-eq-right-strict-concat refl q r s = (inv left-unit-right-strict-concat ∙ s) ∙ inv left-unit-right-strict-concat right-transpose-eq-right-strict-concat : {x y : A} (p : x = y) {z : A} (q : y = z) (r : x = z) → p ∙ᵣ q = r → p = r ∙ᵣ inv q right-transpose-eq-right-strict-concat p refl r s = s ``` ### Concatenation is injective ```agda module _ {l1 : Level} {A : UU l1} where is-injective-right-strict-concat : {x y z : A} (p : x = y) {q r : y = z} → p ∙ᵣ q = p ∙ᵣ r → q = r is-injective-right-strict-concat refl s = (inv left-unit-right-strict-concat ∙ s) ∙ left-unit-right-strict-concat is-injective-right-strict-concat' : {x y z : A} (r : y = z) {p q : x = y} → p ∙ᵣ r = q ∙ᵣ r → p = q is-injective-right-strict-concat' refl s = s ``` ## See also - [Yoneda identity types](foundation.yoneda-identity-types.md) - [Computational identity types](foundation.computational-identity-types.md)