Todd Waugh Ambridge, January 2024

# Equality of uniformly continuous predicates

\begin{code}
{-# OPTIONS --without-K --safe #-}

open import MLTT.Spartan
open import UF.FunExt
open import NotionsOfDecidability.Complemented
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.SubtypeClassifier

module TWA.Thesis.Chapter3.PredicateEquality
  (fe : FunExt) (pe : PropExt) where

open import TWA.Thesis.Chapter3.SearchableTypes fe
 hiding (decidable-predicate;decidable-uc-predicate)
open import TWA.Thesis.Chapter3.ClosenessSpaces fe

predicate-= : {X : 𝓤 ̇ }
              (p₁ p₂ : X  Ω 𝓦)
              ((x : X)  p₁ x holds  p₂ x holds)
              p₁  p₂
predicate-= p₁ p₂ f
 = dfunext (fe _ _)
      x  to-subtype-=  _  being-prop-is-prop (fe _ _))
       (pe _ (pr₂ (p₁ x)) (pr₂ (p₂ x)) (pr₁ (f x)) (pr₂ (f x))))

complemented-is-prop : {X : 𝓤 ̇ }
                      (p : X  Ω 𝓦)
                      is-prop (is-complemented  x  p x holds))
complemented-is-prop p
 = Π-is-prop (fe _ _)  x  +-is-prop (pr₂ (p x))
     (Π-is-prop (fe _ _)  _  𝟘-is-prop))
      px ¬px  ¬px px))

uc-continuous-is-prop : (X : ClosenessSpace 𝓤)
                       (p :  X   Ω 𝓦)
                       (δ : )
                       is-prop (p-ucontinuous-with-mod X p δ)
uc-continuous-is-prop X p δ
 = Π-is-prop (fe _ _)  _  Π-is-prop (fe _ _)
      _  Π-is-prop (fe _ _)  _  Π-is-prop (fe _ _)
        _  pr₂ (p _)))))

decidable-uc-predicate-=''
 : (X : ClosenessSpace 𝓤)
  (δ : )
  (p₁ p₂ :  X   Ω 𝓦)
  (d₁ : is-complemented  x  p₁ x holds))
  (d₂ : is-complemented  x  p₂ x holds))
  (ϕ₁ : p-ucontinuous-with-mod X p₁ δ)
  (ϕ₂ : p-ucontinuous-with-mod X p₂ δ)
  p₁  p₂
  _=_ {_} {decidable-uc-predicate 𝓦 X}
     ((p₁ , d₁) , δ , ϕ₁) ((p₂ , d₂) , δ , ϕ₂)
decidable-uc-predicate-='' X δ p p d₁ d₂ ϕ₁ ϕ₂ refl
 = ap  -  (p , -) , δ , ϕ₁) (complemented-is-prop p d₁ d₂)
  ap  -  (p , d₂) , δ , -) (uc-continuous-is-prop X p δ ϕ₁ ϕ₂)

decidable-uc-predicate-='
 : (X : ClosenessSpace 𝓤)
  (δ : )
  (p₁ p₂ :  X   Ω 𝓦)
  (d₁ : is-complemented  x  p₁ x holds))
  (d₂ : is-complemented  x  p₂ x holds))
  (ϕ₁ : p-ucontinuous-with-mod X p₁ δ)
  (ϕ₂ : p-ucontinuous-with-mod X p₂ δ)
  ((x :  X )  p₁ x holds  p₂ x holds)
  _=_ {_} {decidable-uc-predicate 𝓦 X}
     ((p₁ , d₁) , δ , ϕ₁) ((p₂ , d₂) , δ , ϕ₂)
decidable-uc-predicate-=' X δ p₁ p₂ d₁ d₂ ϕ₁ ϕ₂ f
 = decidable-uc-predicate-='' X δ p₁ p₂ d₁ d₂ ϕ₁ ϕ₂
     (predicate-= p₁ p₂ f)

decidable-uc-predicate-=
 : (X : ClosenessSpace 𝓤)
  (p@((p₁ , d₁) , δ₁ , ϕ₁) q@((p₂ , d₂) , δ₂ , ϕ₂)
    : decidable-uc-predicate 𝓦 X)
  δ₁  δ₂
  ((x :  X )  p₁ x holds  p₂ x holds)
  p  q
decidable-uc-predicate-=
 X ((p₁ , d₁) , δ , ϕ₁) ((p₂ , d₂) , δ , ϕ₂) refl f
 = decidable-uc-predicate-=' X δ p₁ p₂ d₁ d₂ ϕ₁ ϕ₂ f

decidable-uc-predicate-with-mod-=
 : (X : ClosenessSpace 𝓤)
  (δ : )
  (p@((p₁ , d₁) , ϕ₁) q@((p₂ , d₂) , ϕ₂)
    : decidable-uc-predicate-with-mod 𝓦 X δ)
  ((x :  X )  p₁ x holds  p₂ x holds)
  p  q
decidable-uc-predicate-with-mod-=
 X δ ((p₁ , d₁) , ϕ₁) ((p₂ , d₂) , ϕ₂) f
 = to-subtype-=  p  uc-continuous-is-prop X (pr₁ p) δ)
     (to-subtype-=  p  complemented-is-prop p)
       (predicate-= p₁ p₂ f))
\end{code}