Martin Escardo, 26 January 2018. Moved from the file TotallySeparated 22 August 2024. Definition of apartness relation and basic general facts. \begin{code} {-# OPTIONS --safe --without-K #-} module Apartness.Definition where open import MLTT.Spartan open import UF.DiscreteAndSeparated hiding (tight) open import UF.FunExt open import UF.Lower-FunExt open import UF.NotNotStablePropositions open import UF.PropTrunc open import UF.Sets open import UF.Sets-Properties open import UF.Subsingletons open import UF.Subsingletons-FunExt is-prop-valued is-irreflexive is-symmetric is-strongly-cotransitive is-tight is-strong-apartness : {X : 𝓤 ̇ } → (X → X → 𝓥 ̇ ) → 𝓤 ⊔ 𝓥 ̇ is-prop-valued _♯_ = ∀ x y → is-prop (x ♯ y) is-irreflexive _♯_ = ∀ x → ¬ (x ♯ x) is-symmetric _♯_ = ∀ x y → x ♯ y → y ♯ x is-strongly-cotransitive _♯_ = ∀ x y z → x ♯ y → (x ♯ z) + (y ♯ z) is-tight _♯_ = ∀ x y → ¬ (x ♯ y) → x = y is-strong-apartness _♯_ = is-prop-valued _♯_ × is-irreflexive _♯_ × is-symmetric _♯_ × is-strongly-cotransitive _♯_ Strong-Apartness : 𝓤 ̇ → (𝓥 : Universe) → 𝓥 ⁺ ⊔ 𝓤 ̇ Strong-Apartness X 𝓥 = Σ _♯_ ꞉ (X → X → 𝓥 ̇) , is-strong-apartness _♯_ \end{code} Not-not equal elements are not apart, and hence, in the presence of tightness, they are equal. It follows that tight apartness types are sets. \begin{code} double-negation-of-equality-gives-negation-of-apartness : {X : 𝓤 ̇ } (x y : X) (_♯_ : X → X → 𝓥 ̇ ) → is-irreflexive _♯_ → ¬¬ (x = y) → ¬ (x ♯ y) double-negation-of-equality-gives-negation-of-apartness x y _♯_ i = contrapositive f where f : x ♯ y → ¬ (x = y) f a refl = i y a tight-types-are-¬¬-separated' : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-irreflexive _♯_ → is-tight _♯_ → is-¬¬-separated X tight-types-are-¬¬-separated' _♯_ i t = f where f : ∀ x y → ¬¬ (x = y) → x = y f x y φ = t x y (double-negation-of-equality-gives-negation-of-apartness x y _♯_ i φ) tight-types-are-sets' : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → funext 𝓤 𝓤₀ → is-irreflexive _♯_ → is-tight _♯_ → is-set X tight-types-are-sets' _♯_ fe i t = ¬¬-separated-types-are-sets fe (tight-types-are-¬¬-separated' _♯_ i t) \end{code} To define apartness we need to define (weak) cotransitivity, and for this we need to assume the existence of propositional truncations. \begin{code} module Apartness (pt : propositional-truncations-exist) where open PropositionalTruncation pt is-cotransitive is-apartness : {X : 𝓤 ̇ } → (X → X → 𝓥 ̇ ) → 𝓤 ⊔ 𝓥 ̇ is-cotransitive _♯_ = ∀ x y z → x ♯ y → x ♯ z ∨ y ♯ z is-apartness _♯_ = is-prop-valued _♯_ × is-irreflexive _♯_ × is-symmetric _♯_ × is-cotransitive _♯_ Apartness : 𝓤 ̇ → (𝓥 : Universe) → 𝓥 ⁺ ⊔ 𝓤 ̇ Apartness X 𝓥 = Σ _♯_ ꞉ (X → X → 𝓥 ̇) , is-apartness _♯_ cotransitive-if-strongly-cotransitive : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-strongly-cotransitive _♯_ → is-cotransitive _♯_ cotransitive-if-strongly-cotransitive _♯_ sc x y z a = ∣ sc x y z a ∣ strong-apartness-is-apartness : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-strong-apartness _♯_ → is-apartness _♯_ strong-apartness-is-apartness _♯_ (p , i , s , c) = p , i , s , cotransitive-if-strongly-cotransitive _♯_ c Tight-Apartness : 𝓤 ̇ → (𝓥 : Universe) → 𝓥 ⁺ ⊔ 𝓤 ̇ Tight-Apartness X 𝓥 = Σ _♯_ ꞉ (X → X → 𝓥 ̇) , is-apartness _♯_ × is-tight _♯_ apartness-is-prop-valued : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → is-prop-valued _♯_ apartness-is-prop-valued _♯_ (p , i , s , c) = p apartness-is-irreflexive : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → is-irreflexive _♯_ apartness-is-irreflexive _♯_ (p , i , s , c) = i apartness-is-irreflexive' : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → (x y : X) → x ♯ y → x ≠ y apartness-is-irreflexive' _♯_ (p , i , s , c) x y a refl = i x a apartness-is-symmetric : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → is-symmetric _♯_ apartness-is-symmetric _♯_ (p , i , s , c) = s apartness-is-cotransitive : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → is-cotransitive _♯_ apartness-is-cotransitive _♯_ (p , i , s , c) = c strong-apartness-is-prop-valued : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-strong-apartness _♯_ → is-prop-valued _♯_ strong-apartness-is-prop-valued _♯_ (p , i , s , c) = p strong-apartness-is-irreflexive : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-strong-apartness _♯_ → is-irreflexive _♯_ strong-apartness-is-irreflexive _♯_ (p , i , s , c) = i strong-apartness-is-irreflexive' : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-strong-apartness _♯_ → (x y : X) → x ♯ y → x ≠ y strong-apartness-is-irreflexive' _♯_ (p , i , s , c) x y a refl = i x a strong-apartness-is-symmetric : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-strong-apartness _♯_ → is-symmetric _♯_ strong-apartness-is-symmetric _♯_ (p , i , s , c) = s strong-apartness-is-cotransitive : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-strong-apartness _♯_ → is-strongly-cotransitive _♯_ strong-apartness-is-cotransitive _♯_ (p , i , s , c) = c not-equal-if-apart : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → {x y : X} → x ♯ y → x ≠ y not-equal-if-apart _♯_ a {x} {y} h refl = apartness-is-irreflexive _♯_ a x h not-not-equal-not-apart : {X : 𝓤 ̇ } (x y : X) (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → ¬¬ (x = y) → ¬ (x ♯ y) not-not-equal-not-apart x y _♯_ (_ , i , _ , _) = double-negation-of-equality-gives-negation-of-apartness x y _♯_ i tight-types-are-¬¬-separated : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → is-apartness _♯_ → is-tight _♯_ → is-¬¬-separated X tight-types-are-¬¬-separated _♯_ (_ , i , _ , _) = tight-types-are-¬¬-separated' _♯_ i tight-types-are-sets : {X : 𝓤 ̇ } (_♯_ : X → X → 𝓥 ̇ ) → funext 𝓤 𝓤₀ → is-apartness _♯_ → is-tight _♯_ → is-set X tight-types-are-sets _♯_ fe (_ , i , _ , _) = tight-types-are-sets' _♯_ fe i finner-than-tight-is-tight : {X : 𝓤 ̇ } → (_♯_ : X → X → 𝓥 ̇) → (_♯'_ : X → X → 𝓥' ̇) → ((x y : X) → x ♯ y → x ♯' y) → is-tight _♯_ → is-tight _♯'_ finner-than-tight-is-tight _♯_ _♯'_ ϕ t = II where I : ∀ x y → ¬ (x ♯' y) → ¬ (x ♯ y) I x y = contrapositive (ϕ x y) II : ∀ x y → ¬ (x ♯' y) → x = y II x y = t x y ∘ I x y \end{code} The above use apartness data, but its existence is enough, because being a ¬¬-separated type and being a set are propositions. \begin{code} tight-separated' : funext 𝓤 𝓤 → {X : 𝓤 ̇ } → (∃ _♯_ ꞉ (X → X → 𝓤 ̇ ), is-apartness _♯_ × is-tight _♯_) → is-¬¬-separated X tight-separated' {𝓤} fe {X} = ∥∥-rec (being-¬¬-separated-is-prop fe) f where f : (Σ _♯_ ꞉ (X → X → 𝓤 ̇ ), is-apartness _♯_ × is-tight _♯_) → is-¬¬-separated X f (_♯_ , a , t) = tight-types-are-¬¬-separated _♯_ a t tight-types-are-sets'' : funext 𝓤 𝓤 → {X : 𝓤 ̇ } → (∃ _♯_ ꞉ (X → X → 𝓤 ̇ ), is-apartness _♯_ × is-tight _♯_) → is-set X tight-types-are-sets'' {𝓤} fe {X} = ∥∥-rec (being-set-is-prop fe) f where f : (Σ _♯_ ꞉ (X → X → 𝓤 ̇ ), is-apartness _♯_ × is-tight _♯_) → is-set X f (_♯_ , a , t) = tight-types-are-sets _♯_ (lower-funext 𝓤 𝓤 fe) a t \end{code} The following is the standard equivalence relation induced by an apartness relation. The tightness axiom defined above says that this equivalence relation is equality. \begin{code} is-equiv-rel : {X : 𝓤 ̇ } → (X → X → 𝓥 ̇ ) → 𝓤 ⊔ 𝓥 ̇ is-equiv-rel _≈_ = is-prop-valued _≈_ × reflexive _≈_ × symmetric _≈_ × transitive _≈_ negation-of-apartness-is-equiv-rel : {X : 𝓤 ̇ } → funext 𝓤 𝓤₀ → (_♯_ : X → X → 𝓤 ̇ ) → is-apartness _♯_ → is-equiv-rel (λ x y → ¬ (x ♯ y)) negation-of-apartness-is-equiv-rel {𝓤} {X} fe _♯_ (♯p , ♯i , ♯s , ♯c) = p , ♯i , s , t where p : (x y : X) → is-prop (¬ (x ♯ y)) p x y = negations-are-props fe s : (x y : X) → ¬ (x ♯ y) → ¬ (y ♯ x) s x y u a = u (♯s y x a) t : (x y z : X) → ¬ (x ♯ y) → ¬ (y ♯ z) → ¬ (x ♯ z) t x y z u v a = v (♯s z y (left-fails-gives-right-holds (♯p z y) b u)) where b : (x ♯ y) ∨ (z ♯ y) b = ♯c x z y a \end{code}