# 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)