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}