# Composition operations on binary families of sets

```agda
module category-theory.composition-operations-on-binary-families-of-sets where
```

<details><summary>Imports</summary>

```agda
open import foundation.cartesian-product-types
open import foundation.dependent-pair-types
open import foundation.function-extensionality
open import foundation.identity-types
open import foundation.iterated-dependent-product-types
open import foundation.propositions
open import foundation.sets
open import foundation.strictly-involutive-identity-types
open import foundation.subtypes
open import foundation.universe-levels
```

</details>

## Idea

Given a type `A`, a
{{#concept "composition operation" Disambiguation="on binary families of sets" Agda=composition-operation-binary-family-Set}}
on a binary family of [sets](foundation-core.sets.md) `hom : A → A → Set` is a
map

```text
  _∘_ : hom y z → hom x y → hom x z
```

for every triple of elements `x y z : A`.

For such operations, we can consider
[properties](foundation-core.propositions.md) such as _associativity_ and
_unitality_.

## Definitions

### Composition operations on binary families of sets

```agda
module _
  {l1 l2 : Level} {A : UU l1} (hom-set : A  A  Set l2)
  where

  composition-operation-binary-family-Set : UU (l1  l2)
  composition-operation-binary-family-Set =
    {x y z : A} 
    type-Set (hom-set y z)  type-Set (hom-set x y)  type-Set (hom-set x z)
```

### Associative composition operations on binary families of sets

A composition operation

```text
  _∘_ : hom y z → hom x y → hom x z
```

on a binary family of sets of morphisms is called
{{#concept "associative" Disambiguation="composition operation on a binary family of sets" Agda=is-associative-composition-operation-binary-family-Set}}
if, for every triple of composable morphisms we have

```text
  (h ∘ g) ∘ f = h ∘ (g ∘ f).
```

We give a slightly nonstandard definition of associativity using the
[strictly involutive identity types](foundation.strictly-involutive-identity-types.md)
rather than the standard [identity types](foundation-core.identity-types.md).
This is because, while the strictly involutive identity types are always
[equivalent](foundation-core.equivalences.md) to the standard ones, they satisfy
the strict computation rule `inv (inv p) ≐ p` which is practical in defining the
[opposite category](category-theory.opposite-categories.md), as this also makes
the opposite construction strictly involutive: `(𝒞ᵒᵖ)ᵒᵖ ≐ 𝒞`.

```agda
module _
  {l1 l2 : Level} {A : UU l1} (hom-set : A  A  Set l2)
  where

  is-associative-composition-operation-binary-family-Set :
    composition-operation-binary-family-Set hom-set  UU (l1  l2)
  is-associative-composition-operation-binary-family-Set comp-hom =
    {x y z w : A}
    (h : type-Set (hom-set z w))
    (g : type-Set (hom-set y z))
    (f : type-Set (hom-set x y)) 
    ( comp-hom (comp-hom h g) f =ⁱ comp-hom h (comp-hom g f))

  associative-composition-operation-binary-family-Set : UU (l1  l2)
  associative-composition-operation-binary-family-Set =
    Σ ( composition-operation-binary-family-Set hom-set)
      ( is-associative-composition-operation-binary-family-Set)

module _
  {l1 l2 : Level} {A : UU l1} (hom-set : A  A  Set l2)
  (H : associative-composition-operation-binary-family-Set hom-set)
  where

  comp-hom-associative-composition-operation-binary-family-Set :
    composition-operation-binary-family-Set hom-set
  comp-hom-associative-composition-operation-binary-family-Set = pr1 H

  involutive-eq-associative-composition-operation-binary-family-Set :
    {x y z w : A}
    (h : type-Set (hom-set z w))
    (g : type-Set (hom-set y z))
    (f : type-Set (hom-set x y)) 
    ( comp-hom-associative-composition-operation-binary-family-Set
      ( comp-hom-associative-composition-operation-binary-family-Set h g)
      ( f)) =ⁱ
    ( comp-hom-associative-composition-operation-binary-family-Set
      ( h)
      ( comp-hom-associative-composition-operation-binary-family-Set g f))
  involutive-eq-associative-composition-operation-binary-family-Set = pr2 H

  witness-associative-composition-operation-binary-family-Set :
    {x y z w : A}
    (h : type-Set (hom-set z w))
    (g : type-Set (hom-set y z))
    (f : type-Set (hom-set x y)) 
    ( comp-hom-associative-composition-operation-binary-family-Set
      ( comp-hom-associative-composition-operation-binary-family-Set h g) (f)) 
    ( comp-hom-associative-composition-operation-binary-family-Set
      ( h) (comp-hom-associative-composition-operation-binary-family-Set g f))
  witness-associative-composition-operation-binary-family-Set h g f =
    eq-involutive-eq
      ( involutive-eq-associative-composition-operation-binary-family-Set h g f)

  inv-witness-associative-composition-operation-binary-family-Set :
    {x y z w : A}
    (h : type-Set (hom-set z w))
    (g : type-Set (hom-set y z))
    (f : type-Set (hom-set x y)) 
    ( comp-hom-associative-composition-operation-binary-family-Set
      ( h) (comp-hom-associative-composition-operation-binary-family-Set g f)) 
    ( comp-hom-associative-composition-operation-binary-family-Set
      ( comp-hom-associative-composition-operation-binary-family-Set h g) (f))
  inv-witness-associative-composition-operation-binary-family-Set h g f =
    eq-involutive-eq
      ( invⁱ
        ( involutive-eq-associative-composition-operation-binary-family-Set
          ( h)
          ( g)
          ( f)))
```

### Unital composition operations on binary families of sets

A composition operation

```text
  _∘_ : hom y z → hom x y → hom x z
```

on a binary family of sets of morphisms is called
{{#concept "unital" Disambiguation="composition operation on a binary family of sets" Agda=is-unital-composition-operation-binary-family-Set}}
if there is a morphism `id_x : hom x x` for every element `x : A` such that

```text
  id_y ∘ f = f   and f ∘ id_x = f.
```

As will be demonstrated momentarily, every composition operation on a binary
family of sets is unital in [at most one](foundation.subterminal-types.md) way.

```agda
module _
  {l1 l2 : Level} {A : UU l1} (hom-set : A  A  Set l2)
  where

  is-unital-composition-operation-binary-family-Set :
    composition-operation-binary-family-Set hom-set  UU (l1  l2)
  is-unital-composition-operation-binary-family-Set comp-hom =
    Σ ( (x : A)  type-Set (hom-set x x))
      ( λ e 
        ( {x y : A} (f : type-Set (hom-set x y))  comp-hom (e y) f  f) ×
        ( {x y : A} (f : type-Set (hom-set x y))  comp-hom f (e x)  f))
```

## Properties

### Being associative is a property of composition operations on binary families of sets

```agda
module _
  {l1 l2 : Level} {A : UU l1}
  (hom-set : A  A  Set l2)
  (comp-hom : composition-operation-binary-family-Set hom-set)
  where
  is-prop-is-associative-composition-operation-binary-family-Set :
    is-prop
      ( is-associative-composition-operation-binary-family-Set hom-set comp-hom)
  is-prop-is-associative-composition-operation-binary-family-Set =
    is-prop-iterated-implicit-Π 4
      ( λ x y z w 
        is-prop-iterated-Π 3
          ( λ h g f 
            is-prop-equiv
              ( equiv-eq-involutive-eq)
              ( is-set-type-Set
                ( hom-set x w)
                ( comp-hom (comp-hom h g) f)
                ( comp-hom h (comp-hom g f)))))

  is-associative-prop-composition-operation-binary-family-Set : Prop (l1  l2)
  pr1 is-associative-prop-composition-operation-binary-family-Set =
    is-associative-composition-operation-binary-family-Set hom-set comp-hom
  pr2 is-associative-prop-composition-operation-binary-family-Set =
    is-prop-is-associative-composition-operation-binary-family-Set
```

### Being unital is a property of composition operations on binary families of sets

**Proof:** Suppose `e e' : (x : A) → hom-set x x` are both right and left units
with regard to composition. It is enough to show that `e = e'` since the right
and left unit laws are propositions (because all hom-types are sets). By
function extensionality, it is enough to show that `e x = e' x` for all
`x : A`. But by the unit laws we have the following chain of equalities:
`e x = (e' x) ∘ (e x) = e' x.`

```agda
module _
  {l1 l2 : Level} {A : UU l1}
  (hom-set : A  A  Set l2)
  (comp-hom : composition-operation-binary-family-Set hom-set)
  where

  abstract
    all-elements-equal-is-unital-composition-operation-binary-family-Set :
      all-elements-equal
        ( is-unital-composition-operation-binary-family-Set hom-set comp-hom)
    all-elements-equal-is-unital-composition-operation-binary-family-Set
      ( e , left-unit-law-e , right-unit-law-e)
      ( e' , left-unit-law-e' , right-unit-law-e') =
      eq-type-subtype
        ( λ x 
          product-Prop
            ( implicit-Π-Prop A
              ( λ a 
                implicit-Π-Prop A
                ( λ b 
                  Π-Prop
                    ( type-Set (hom-set a b))
                    ( λ f'  Id-Prop (hom-set a b) (comp-hom (x b) f') f'))))
            ( implicit-Π-Prop A
              ( λ a 
                implicit-Π-Prop A
                ( λ b 
                  Π-Prop
                    ( type-Set (hom-set a b))
                    ( λ f'  Id-Prop (hom-set a b) (comp-hom f' (x a)) f')))))
        ( eq-htpy
          ( λ x  inv (left-unit-law-e' (e x))  right-unit-law-e (e' x)))

  abstract
    is-prop-is-unital-composition-operation-binary-family-Set :
      is-prop
        ( is-unital-composition-operation-binary-family-Set hom-set comp-hom)
    is-prop-is-unital-composition-operation-binary-family-Set =
      is-prop-all-elements-equal
        all-elements-equal-is-unital-composition-operation-binary-family-Set

  is-unital-prop-composition-operation-binary-family-Set : Prop (l1  l2)
  pr1 is-unital-prop-composition-operation-binary-family-Set =
    is-unital-composition-operation-binary-family-Set hom-set comp-hom
  pr2 is-unital-prop-composition-operation-binary-family-Set =
    is-prop-is-unital-composition-operation-binary-family-Set
```

## See also

- [Set-magmoids](category-theory.set-magmoids.md) capture the structure of
  composition operations on binary families of sets.
- [Precategories](category-theory.precategories.md) are the structure of an
  associative and unital composition operation on a binary families of sets.
- [Nonunital precategories](category-theory.nonunital-precategories.md) are the
  structure of an associative composition operation on a binary families of
  sets.