# Globular types
```agda
{-# OPTIONS --guardedness #-}
module structured-types.globular-types where
```
<details><summary>Imports</summary>
```agda
open import foundation.dependent-pair-types
open import foundation.identity-types
open import foundation.universe-levels
```
</details>
## Idea
A {{#concept "globular type" Agda=Globular-Type}} is a type equipped with a
[binary relation](foundation.binary-relations.md) valued in globular types.
Thus, a globular type consists of a base type `A` which is called the type of
$0$-cells, and for every pair of $0$-cells, a type of $1$-cells, and for every
pair of $1$-cells a type of $2$-cells, and so on _ad infinitum_. For every pair
of $n$-cells `s` and `t`, there is a type of $(n+1)$-cells _from `s` to `t`_,
and we say the $(n+1)$-cells have _source_ `s` and _target_ `t`.
The standard interpretation of the higher cells of a globular type is as arrows
from their source to their target. For instance, given two $0$-cells `x` and
`y`, two $1$-cells `f` and `g` from `x` to `y`, two $2$-cells `H` and `K` from
`f` to `g`, and a $3$-cell `α` from `H` to `K`, a common depiction would be
```text
f
-------------
/ // \\ \
/ // α \\ ∨
x H|| ≡≡≡≡≡≡> ||K y.
\ \\ // ∧
\ V V /
-------------
g
```
We follow the conventional approach of the library and start by defining the
globular [structure](foundation.structure.md) on a type, and then define a
globular type to be a type equipped with such structure. Note that we could
equivalently have started by defining globular types, and then define globular
structures on a type as binary families of globular types on it, but this is a
special property of globular types.
## Definitions
### The structure of a globular type
**Comment.** The choice to add a second universe level in the definition of a
globular structure may seem rather arbitrary, but makes the concept applicable
in particular extra cases that are of use to us when working with
[large globular structures](structured-types.large-globular-types.md).
```agda
record
globular-structure {l1 : Level} (l2 : Level) (A : UU l1) : UU (l1 ⊔ lsuc l2)
where
coinductive
field
1-cell-globular-structure :
(x y : A) → UU l2
globular-structure-1-cell-globular-structure :
(x y : A) → globular-structure l2 (1-cell-globular-structure x y)
open globular-structure public
```
#### Iterated projections for globular structures
```agda
module _
{l1 l2 : Level} {A : UU l1} (G : globular-structure l2 A)
{x y : A} (f g : 1-cell-globular-structure G x y)
where
2-cell-globular-structure : UU l2
2-cell-globular-structure =
1-cell-globular-structure
( globular-structure-1-cell-globular-structure G x y) f g
globular-structure-2-cell-globular-structure :
globular-structure l2 2-cell-globular-structure
globular-structure-2-cell-globular-structure =
globular-structure-1-cell-globular-structure
( globular-structure-1-cell-globular-structure G x y) f g
module _
{l1 l2 : Level} {A : UU l1} (G : globular-structure l2 A)
{x y : A} {f g : 1-cell-globular-structure G x y}
(p q : 2-cell-globular-structure G f g)
where
3-cell-globular-structure : UU l2
3-cell-globular-structure =
1-cell-globular-structure
( globular-structure-2-cell-globular-structure G f g) p q
globular-structure-3-cell-globular-structure :
globular-structure l2 3-cell-globular-structure
globular-structure-3-cell-globular-structure =
globular-structure-1-cell-globular-structure
( globular-structure-2-cell-globular-structure G f g) p q
module _
{l1 l2 : Level} {A : UU l1} (G : globular-structure l2 A)
{x y : A} {f g : 1-cell-globular-structure G x y}
{p q : 2-cell-globular-structure G f g}
(H K : 3-cell-globular-structure G p q)
where
4-cell-globular-structure : UU l2
4-cell-globular-structure =
1-cell-globular-structure
( globular-structure-3-cell-globular-structure G p q) H K
globular-structure-4-cell-globular-structure :
globular-structure l2 4-cell-globular-structure
globular-structure-4-cell-globular-structure =
globular-structure-1-cell-globular-structure
( globular-structure-3-cell-globular-structure G p q) H K
```
### The type of globular types
```agda
Globular-Type : (l1 l2 : Level) → UU (lsuc l1 ⊔ lsuc l2)
Globular-Type l1 l2 = Σ (UU l1) (globular-structure l2)
module _
{l1 l2 : Level} (A : Globular-Type l1 l2)
where
0-cell-Globular-Type : UU l1
0-cell-Globular-Type = pr1 A
globular-structure-0-cell-Globular-Type :
globular-structure l2 0-cell-Globular-Type
globular-structure-0-cell-Globular-Type = pr2 A
1-cell-Globular-Type : (x y : 0-cell-Globular-Type) → UU l2
1-cell-Globular-Type =
1-cell-globular-structure globular-structure-0-cell-Globular-Type
globular-structure-1-cell-Globular-Type :
(x y : 0-cell-Globular-Type) →
globular-structure l2 (1-cell-Globular-Type x y)
globular-structure-1-cell-Globular-Type =
globular-structure-1-cell-globular-structure
( globular-structure-0-cell-Globular-Type)
1-cell-globular-type-Globular-Type :
(x y : 0-cell-Globular-Type) → Globular-Type l2 l2
1-cell-globular-type-Globular-Type x y =
( 1-cell-Globular-Type x y , globular-structure-1-cell-Globular-Type x y)
2-cell-Globular-Type :
{x y : 0-cell-Globular-Type} (f g : 1-cell-Globular-Type x y) → UU l2
2-cell-Globular-Type =
2-cell-globular-structure globular-structure-0-cell-Globular-Type
globular-structure-2-cell-Globular-Type :
{x y : 0-cell-Globular-Type} (f g : 1-cell-Globular-Type x y) →
globular-structure l2 (2-cell-Globular-Type f g)
globular-structure-2-cell-Globular-Type =
globular-structure-2-cell-globular-structure
( globular-structure-0-cell-Globular-Type)
2-cell-globular-type-Globular-Type :
{x y : 0-cell-Globular-Type} (f g : 1-cell-Globular-Type x y) →
Globular-Type l2 l2
2-cell-globular-type-Globular-Type f g =
( 2-cell-Globular-Type f g , globular-structure-2-cell-Globular-Type f g)
3-cell-Globular-Type :
{x y : 0-cell-Globular-Type} {f g : 1-cell-Globular-Type x y}
(H K : 2-cell-Globular-Type f g) → UU l2
3-cell-Globular-Type =
3-cell-globular-structure globular-structure-0-cell-Globular-Type
4-cell-Globular-Type :
{x y : 0-cell-Globular-Type} {f g : 1-cell-Globular-Type x y}
{H K : 2-cell-Globular-Type f g} (α β : 3-cell-Globular-Type H K) → UU l2
4-cell-Globular-Type =
4-cell-globular-structure globular-structure-0-cell-Globular-Type
```
## Examples
### The globular structure on a type given by its identity types
```agda
globular-structure-Id : {l : Level} (A : UU l) → globular-structure l A
globular-structure-Id A =
λ where
.1-cell-globular-structure x y →
x = y
.globular-structure-1-cell-globular-structure x y →
globular-structure-Id (x = y)
```
## See also
- [Reflexive globular types](structured-types.reflexive-globular-types.md)
- [Symmetric globular types](structured-types.symmetric-globular-types.md)
- [Transitive globular types](structured-types.transitive-globular-types.md)