# Copartial functions
```agda
module foundation.copartial-functions where
```
<details><summary>Imports</summary>
```agda
open import foundation.copartial-elements
open import foundation.partial-functions
open import foundation.propositions
open import foundation.universe-levels
```
</details>
## Idea
A {{#concept "copartial function" Agda=copartial-function}} from `A` to `B` is a
map from `A` into the type of
[copartial elements](foundation.copartial-elements.md) of `B`. I.e., a copartial
function is a map
```text
A → Σ (Q : Prop), B * Q
```
where `- * Q` is the
[closed modality](orthogonal-factorization-systems.closed-modalities.md), which
is defined by the [join operation](synthetic-homotopy-theory.joins-of-types.md).
Evaluation of a copartial function `f` at `a : A` is said to be
{{#concept "denied" Disambiguation="copartial function" Agda=is-denied-copartial-function}}
if evaluation of the copartial element `f a` of `B` is denied.
A copartial function is [equivalently](foundation-core.equivalences.md)
described as a [morphism of arrows](foundation.morphisms-arrows.md)
```text
A B 1
| | |
id | ⇒ | □ | T
∨ ∨ ∨
A 1 Prop
```
where `□` is the
[pushout-product](synthetic-homotopy-theory.pushout-products.md). Indeed, the
domain of the pushout-product `B □ T` is the type of copartial elements of `B`.
{{#concept "Composition" Disambiguation="copartial functions"}} of copartial
functions can be defined by
```text
copartial-element (copartial-element C)
∧ |
map-copartial-element g / | join-copartial-element
/ ∨
A ----> copartial-element B copartial-element C
f
```
In this diagram, the map going up is defined by functoriality of the operation
```text
X ↦ Σ (Q : Prop), X * Q
```
The map going down is defined by the join operation on copartial elements, i.e.,
the pushout-product algebra structure of the map `T : 1 → Prop`. The main idea
behind composition of copartial functions is that a composite of copartial
function is denied on the union of the subtypes where each factor is denied.
Indeed, if `f` is denied at `a` or `map-copartial-element g` is denied at the
copartial element `f a` of `B`, then the composite of copartial functions
`g ∘ f` should be denied at `a`.
**Note:** The topic of copartial functions was not known to us in the
literature, and our formalization on this topic should be considered
experimental.
## Definitions
### Copartial dependent functions
```agda
copartial-dependent-function :
{l1 l2 : Level} (l3 : Level) (A : UU l1) → (A → UU l2) →
UU (l1 ⊔ l2 ⊔ lsuc l3)
copartial-dependent-function l3 A B = (x : A) → copartial-element l3 (B x)
```
### Copartial functions
```agda
copartial-function :
{l1 l2 : Level} (l3 : Level) → UU l1 → UU l2 → UU (l1 ⊔ l2 ⊔ lsuc l3)
copartial-function l3 A B = copartial-dependent-function l3 A (λ _ → B)
```
### Denied values of copartial dependent functions
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2}
(f : copartial-dependent-function l3 A B) (a : A)
where
is-denied-prop-copartial-dependent-function : Prop l3
is-denied-prop-copartial-dependent-function =
is-denied-prop-copartial-element (f a)
is-denied-copartial-dependent-function : UU l3
is-denied-copartial-dependent-function = is-denied-copartial-element (f a)
```
### Denied values of copartial functions
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f : copartial-function l3 A B)
(a : A)
where
is-denied-prop-copartial-function : Prop l3
is-denied-prop-copartial-function =
is-denied-prop-copartial-dependent-function f a
is-denied-copartial-function : UU l3
is-denied-copartial-function =
is-denied-copartial-dependent-function f a
```
### Copartial dependent functions obtained from dependent functions
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : A → UU l2} (f : (x : A) → B x)
where
copartial-dependent-function-dependent-function :
copartial-dependent-function lzero A B
copartial-dependent-function-dependent-function a =
unit-copartial-element (f a)
```
### Copartial functions obtained from functions
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B)
where
copartial-function-function : copartial-function lzero A B
copartial-function-function =
copartial-dependent-function-dependent-function f
```
## Properties
### The underlying partial dependent function of a copartial dependent function
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2}
(f : copartial-dependent-function l3 A B)
where
partial-dependent-function-copartial-dependent-function :
partial-dependent-function l3 A B
partial-dependent-function-copartial-dependent-function a =
partial-element-copartial-element (f a)
```
### The underlying partial function of a copartial function
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f : copartial-function l3 A B)
where
partial-function-copartial-function : partial-function l3 A B
partial-function-copartial-function a =
partial-element-copartial-element (f a)
```
## See also
- [Partial functions](foundation.partial-functions.md)