# The binary action on identifications of binary functions

```agda
module foundation.action-on-identifications-binary-functions 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

Given a binary operation `f : A → B → C` and
[identifications](foundation-core.identity-types.md) `p : x = x'` in `A` and
`q : y = y'` in `B`, we obtain an identification

```text
  ap-binary f p q : f x y = f x' y'
```

we call this the
{{#concept "binary action on identifications of binary functions" Agda=ap-binary}}.

There are a few different ways we can define `ap-binary`. We could define it by
pattern matching on both `p` and `q`, but this leads to restricted computational
behaviour. Instead, we define it as the upper concatenation in the Gray
interchanger diagram

```text
                      ap (r ↦ f x r) q
                 f x y -------------> f x y'
                   |                    |
                   |                    |
  ap (r ↦ f r y) p |                    | ap (r ↦ f r y') p
                   |                    |
                   ∨                    ∨
                 f x' y ------------> f x' y'.
                      ap (r ↦ f x' r) q
```

## Definition

### The binary action on identifications of binary functions

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (f : A  B  C)
  where

  ap-binary :
    {x x' : A} (p : x  x') {y y' : B} (q : y  y')  f x y  f x' y'
  ap-binary {x} {x'} p {y} {y'} q = ap  r  f r y) p  ap (f x') q
```

## Properties

### The binary action on identifications in terms of the unary action on identifications

The binary action on identifications computes as a concatenation of applications
of the
[unary action on identifications of functions](foundation.action-on-identifications-functions.md):

```text
  ap-binary f p q = ap (r ↦ f r y) p ∙ ap (r ↦ f x' r) q
```

and

```text
  ap-binary f p q = ap (r ↦ f x r) q ∙ ap (r ↦ f r y') p.
```

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (f : A  B  C)
  where

  triangle-ap-binary :
    {x x' : A} (p : x  x') {y y' : B} (q : y  y') 
    ap-binary f p q  ap  r  f r y) p  ap (f x') q
  triangle-ap-binary _ _ = refl

  triangle-ap-binary' :
    {x x' : A} (p : x  x') {y y' : B} (q : y  y') 
    ap-binary f p q  ap (f x) q  ap  r  f r y') p
  triangle-ap-binary' refl refl = refl
```

### The unit laws for the binary action on identifications of binary functions

The binary action on identifications of binary functions evaluated at a
reflexivity computes as an instance of unary action on identifications of
(unary) functions.

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (f : A  B  C)
  where

  left-unit-ap-binary :
    {x : A} {y y' : B} (q : y  y')  ap-binary f refl q  ap (f x) q
  left-unit-ap-binary _ = refl

  right-unit-ap-binary :
    {x x' : A} (p : x  x') {y : B}  ap-binary f p refl  ap  r  f r y) p
  right-unit-ap-binary refl = refl
```

### The binary action on identifications evaluated on the diagonal

The binary action on identifications evaluated on the diagonal computes as an
instance of unary action on identifications. Specifically, we have the following
uncurried [commuting square](foundation-core.commuting-squares-of-maps.md)

```text
                           (- ∘ Δ) × 1
       (A × A → B) × Path A --------> (A → B) × Path A
                |                             |
                |                             |
          1 × Δ |                             | ap
                |                             |
                ∨                             ∨
  (A × A → B) × Path A × Path A ----------> Path B.
                                 ap-binary
```

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A  A  B)
  where

  ap-binary-diagonal :
    {x x' : A} (p : x  x')  ap-binary f p p  ap  r  f r r) p
  ap-binary-diagonal refl = refl
```

### The binary action on identifications distributes over identification concatenation

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (f : A  B  C)
  where

  ap-binary-concat :
    {x y z : A} (p : x  y) (p' : y  z)
    {x' y' z' : B} (q : x'  y') (q' : y'  z') 
    ap-binary f (p  p') (q  q')  ap-binary f p q  ap-binary f p' q'
  ap-binary-concat refl _ refl _ = refl
```

### The binary action on identifications distributes over function composition

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (H : A  B  C)
  where

  ap-binary-comp :
    {l4 l5 : Level} {X : UU l4} {Y : UU l5} (f : X  A) (g : Y  B)
    {x x' : X} (p : x  x') {y y' : Y} (q : y  y') 
    ap-binary  x y  H (f x) (g y)) p q  ap-binary H (ap f p) (ap g q)
  ap-binary-comp f g refl refl = refl

  ap-binary-comp-diagonal :
    {l4 : Level} {A' : UU l4} (f : A'  A) (g : A'  B)
    {x y : A'} (p : x  y) 
    ap  z  H (f z) (g z)) p  ap-binary H (ap f p) (ap g p)
  ap-binary-comp-diagonal f g p =
    ( inv (ap-binary-diagonal  x y  H (f x) (g y)) p)) 
    ( ap-binary-comp f g p p)

  ap-binary-comp' :
    {l4 : Level} {D : UU l4} (f : C  D)
    {x x' : A} (p : x  x') {y y' : B} (q : y  y') 
    ap-binary  a b  f (H a b)) p q  ap f (ap-binary H p q)
  ap-binary-comp' f refl refl = refl
```

### Computing the binary action on identifications when swapping argument order

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (f : A  B  C)
  where

  ap-binary-permute :
    {x x' : A} (p : x  x') {y y' : B} (q : y  y') 
    ap-binary  y x  f x y) q p  ap-binary f p q
  ap-binary-permute refl refl = refl
```

## See also

- [Action of functions on identifications](foundation.action-on-identifications-functions.md)
- [Action of functions on higher identifications](foundation.action-on-higher-identifications-functions.md).
- [Action of dependent functions on identifications](foundation.action-on-identifications-dependent-functions.md).