# Binary relations with extensions

```agda
module foundation.binary-relations-with-extensions where
```

<details><summary>Imports</summary>

```agda
open import foundation.binary-relations
open import foundation.dependent-pair-types
open import foundation.iterated-dependent-product-types
open import foundation.universe-levels

open import foundation-core.propositions
```

</details>

## Idea

We say a [relation](foundation.binary-relations.md) `R`
{{#concept "has extensions" Disambiguation="binary relations of types" Agda=has-extensions-Relation}}
if for every triple `x y z : A`, there is a binary operation

```text
  R x y → R x z → R y z.
```

Relations with extensions are closely related to transitive relations. But,
instead of giving for every diagram

```text
       y
      ∧ \
     /   \
    /     ∨
  x        z
```

a horizontal arrow `x → z`, a binary relation with extensions gives, for every
span

```text
       y
      ∧
     /
    /
  x -----> z,
```

an _extension_ `y → z`. By symmetry it also gives an extension in the opposite
direction `z → y`.

Dually, a relation `R`
[has lifts](foundation.binary-relations-with-extensions.md) if for every triple
`x y z : A`, there is a binary operation

```text
  R x z → R y z → R x y.
```

## Definition

### The structure on relations of having extensions

```agda
module _
  {l1 l2 : Level} {A : UU l1} (R : Relation l2 A)
  where

  has-extensions-Relation : UU (l1  l2)
  has-extensions-Relation = {x y z : A}  R x y  R x z  R y z
```

## Properties

### If there is an element that relates to `y` and the relation has extensions, then `y` relates to `y`

```agda
module _
  {l1 l2 : Level} {A : UU l1} (R : Relation l2 A)
  where

  rel-self-any-rel-has-extensions-Relation :
    has-extensions-Relation R  {x y : A}  R x y  R y y
  rel-self-any-rel-has-extensions-Relation H p = H p p
```

### The reverse of an extension

```agda
module _
  {l1 l2 : Level} {A : UU l1} (R : Relation l2 A)
  where

  reverse-has-extensions-Relation :
    has-extensions-Relation R  {x y z : A}  R z x  R z y  R y x
  reverse-has-extensions-Relation H p q = H q p
```

### Reflexive relations with extensions are symmetric

```agda
module _
  {l1 l2 : Level} {A : UU l1} (R : Relation l2 A)
  (H : has-extensions-Relation R)
  where

  is-symmetric-is-reflexive-has-extensions-Relation :
    is-reflexive R  is-symmetric R
  is-symmetric-is-reflexive-has-extensions-Relation r x y p = H p (r x)
```

### Reflexive relations with extensions are transitive

```agda
module _
  {l1 l2 : Level} {A : UU l1} (R : Relation l2 A)
  (H : has-extensions-Relation R)
  where

  is-transitive-is-symmetric-has-extensions-Relation :
    is-symmetric R  is-transitive R
  is-transitive-is-symmetric-has-extensions-Relation s x y z p q = H (s x y q) p

  is-transitive-is-reflexive-has-extensions-Relation :
    is-reflexive R  is-transitive R
  is-transitive-is-reflexive-has-extensions-Relation r =
    is-transitive-is-symmetric-has-extensions-Relation
      ( is-symmetric-is-reflexive-has-extensions-Relation R H r)
```

## See also

- [Strict symmetrization of binary relations](foundation.strict-symmetrization-binary-relations.md)