# Tight apartness relations

```agda
module foundation.tight-apartness-relations where
```

<details><summary>Imports</summary>

```agda
open import foundation.apartness-relations
open import foundation.binary-relations
open import foundation.dependent-pair-types
open import foundation.function-extensionality
open import foundation.propositional-truncations
open import foundation.universe-levels

open import foundation-core.cartesian-product-types
open import foundation-core.identity-types
open import foundation-core.negation
open import foundation-core.propositions
```

</details>

## Idea

A [relation](foundation.binary-relations.md) `R` is said to be **tight** if for
every `x y : A` we have `¬ (R x y) → (x = y)`.

## Definition

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

  is-tight : UU (l1  l2)
  is-tight = (x y : A)  ¬ (type-Prop (R x y))  x  y

  is-tight-apartness-relation : UU (l1  l2)
  is-tight-apartness-relation =
    is-apartness-relation R × is-tight

is-tight-Apartness-Relation :
  {l1 l2 : Level} {A : UU l1} (R : Apartness-Relation l2 A)  UU (l1  l2)
is-tight-Apartness-Relation R = is-tight (rel-Apartness-Relation R)

Tight-Apartness-Relation :
  {l1 : Level} (l2 : Level) (A : UU l1)  UU (l1  lsuc l2)
Tight-Apartness-Relation l2 A =
  Σ (Apartness-Relation l2 A) (is-tight-Apartness-Relation)

module _
  {l1 l2 : Level} {A : UU l1} (R : Tight-Apartness-Relation l2 A)
  where

  apartness-relation-Tight-Apartness-Relation :
    Apartness-Relation l2 A
  apartness-relation-Tight-Apartness-Relation = pr1 R

  is-tight-apartness-relation-Tight-Apartness-Relation :
    is-tight-Apartness-Relation apartness-relation-Tight-Apartness-Relation
  is-tight-apartness-relation-Tight-Apartness-Relation = pr2 R
```

### Types with tight apartness

```agda
Type-With-Tight-Apartness : (l1 l2 : Level)  UU (lsuc l1  lsuc l2)
Type-With-Tight-Apartness l1 l2 =
  Σ ( Type-With-Apartness l1 l2)
    ( λ X  is-tight (rel-apart-Type-With-Apartness X))

module _
  {l1 l2 : Level} (X : Type-With-Tight-Apartness l1 l2)
  where

  type-with-apartness-Type-With-Tight-Apartness : Type-With-Apartness l1 l2
  type-with-apartness-Type-With-Tight-Apartness = pr1 X

  type-Type-With-Tight-Apartness : UU l1
  type-Type-With-Tight-Apartness =
    type-Type-With-Apartness type-with-apartness-Type-With-Tight-Apartness

  rel-apart-Type-With-Tight-Apartness :
    Relation-Prop l2 type-Type-With-Tight-Apartness
  rel-apart-Type-With-Tight-Apartness =
    rel-apart-Type-With-Apartness type-with-apartness-Type-With-Tight-Apartness

  apart-Type-With-Tight-Apartness :
    Relation l2 type-Type-With-Tight-Apartness
  apart-Type-With-Tight-Apartness =
    apart-Type-With-Apartness type-with-apartness-Type-With-Tight-Apartness

  is-tight-apart-Type-With-Tight-Apartness :
    is-tight rel-apart-Type-With-Tight-Apartness
  is-tight-apart-Type-With-Tight-Apartness = pr2 X
```

## Properties

### The apartness relation of functions into a type with tight apartness is tight

```agda
is-tight-apartness-function-into-Type-With-Tight-Apartness :
  {l1 l2 l3 : Level} {X : UU l1} (Y : Type-With-Tight-Apartness l2 l3) 
  is-tight
    ( rel-apart-function-into-Type-With-Apartness X
      ( type-with-apartness-Type-With-Tight-Apartness Y))
is-tight-apartness-function-into-Type-With-Tight-Apartness Y f g H =
  eq-htpy
    ( λ x 
      is-tight-apart-Type-With-Tight-Apartness Y
        ( f x)
        ( g x)
        ( λ u  H ( unit-trunc-Prop (x , u))))

exp-Type-With-Tight-Apartness :
  {l1 l2 l3 : Level} (X : UU l1)  Type-With-Tight-Apartness l2 l3 
  Type-With-Tight-Apartness (l1  l2) (l1  l3)
pr1 (exp-Type-With-Tight-Apartness X Y) =
  exp-Type-With-Apartness X (type-with-apartness-Type-With-Tight-Apartness Y)
pr2 (exp-Type-With-Tight-Apartness X Y) =
  is-tight-apartness-function-into-Type-With-Tight-Apartness Y
```