Ian Ray, started: 2023-09-12 - updated: 2024-02-05 We define the notion of a small basis for a suplattice as well as some boiler plate. This consists of a type B and a map β : B → L. In a sense to be made precise we say the pair B and q generate the suplattice. This notion is crucial for the development of predicative order theory. This notion of a basis was motivated by the set theoretic formulation due to Curi (see http://doi.org/10.1090/proc/12569) and can be compared with a similar notion for Domains due to Tom de Jong (see DomainTheory.BasisAndContinuity). A suplattice L that has suprema for family of size 𝓥 has a basis if there is a type B : 𝓥 and map β : B → L such that β b ≤ x is 𝓥 small and x = ⋁ ↓ᴮ x for all x. \begin{code} {-# OPTIONS --safe --without-K --exact-split #-} open import MLTT.Spartan open import UF.Equiv open import UF.EquivalenceExamples open import UF.FunExt open import UF.Logic open import UF.PropTrunc open import UF.Subsingletons open import UF.SubtypeClassifier open import UF.Size module OrderedTypes.SupLattice-SmallBasis (pt : propositional-truncations-exist) (fe : Fun-Ext) where open import Locales.Frame pt fe hiding (⟨_⟩ ; join-of) open import Slice.Family open import OrderedTypes.SupLattice pt fe open AllCombinators pt fe open PropositionalTruncation pt \end{code} \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) where private _≤_ : ⟨ L ⟩ → ⟨ L ⟩ → Ω 𝓣 _≤_ = order-of L ⋁_ : Fam 𝓥 ⟨ L ⟩ → ⟨ L ⟩ ⋁_ = join-of L open Joins _≤_ ↓ᴮ : ⟨ L ⟩ → 𝓣 ⊔ 𝓥 ̇ ↓ᴮ x = Σ b ꞉ B , (β b ≤ x) holds ↓ᴮ-to-base : (x : ⟨ L ⟩) → ↓ᴮ x → B ↓ᴮ-to-base x = pr₁ ↓ᴮ-inclusion : (x : ⟨ L ⟩) → ↓ᴮ x → ⟨ L ⟩ ↓ᴮ-inclusion x = β ∘ ↓ᴮ-to-base x \end{code} It is worth mentioning the ↓ᴮ-inclusion need not be an injection as β is not. Now we define is-small-basis as a record type and proceed to write some boiler plate that will allow us to use a small basis with greater efficiency. \begin{code} record is-basis : 𝓤 ⊔ 𝓣 ⊔ 𝓥 ⁺ ̇ where field ≤-is-small : (x : ⟨ L ⟩) (b : B) → ((β b ≤ x) holds) is 𝓥 small ↓-is-sup : (x : ⟨ L ⟩) → (x is-lub-of (↓ᴮ x , ↓ᴮ-inclusion x)) holds is-upper-bound-↓ : (x : ⟨ L ⟩) → (x is-an-upper-bound-of (↓ᴮ x , ↓ᴮ-inclusion x)) holds is-upper-bound-↓ x = pr₁ (↓-is-sup x) is-least-upper-bound-↓ : (x : ⟨ L ⟩) → ((u' , _) : upper-bound (↓ᴮ x , ↓ᴮ-inclusion x)) → (x ≤ u') holds is-least-upper-bound-↓ x = pr₂ (↓-is-sup x) _≤ᴮ_ : (b : B) → (x : ⟨ L ⟩) → 𝓥 ̇ b ≤ᴮ x = (resized ((β b ≤ x) holds)) (≤-is-small x b) ≤ᴮ-≃-≤ : {b : B} {x : ⟨ L ⟩} → (b ≤ᴮ x) ≃ ((β b) ≤ x) holds ≤ᴮ-≃-≤ {b} {x} = (resizing-condition) (≤-is-small x b) ≤ᴮ-to-≤ : {b : B} {x : ⟨ L ⟩} → (b ≤ᴮ x) → ((β b) ≤ x) holds ≤ᴮ-to-≤ = ⌜ ≤ᴮ-≃-≤ ⌝ ≤-to-≤ᴮ : {b : B} {x : ⟨ L ⟩} → ((β b) ≤ x) holds → (b ≤ᴮ x) ≤-to-≤ᴮ = ⌜ ≤ᴮ-≃-≤ ⌝⁻¹ ≤ᴮ-is-prop-valued : {b : B} {x : ⟨ L ⟩} → is-prop (b ≤ᴮ x) ≤ᴮ-is-prop-valued {b} {x} = equiv-to-prop ≤ᴮ-≃-≤ (holds-is-prop ((β b) ≤ x)) small-↓ᴮ : ⟨ L ⟩ → 𝓥 ̇ small-↓ᴮ x = Σ b ꞉ B , b ≤ᴮ x small-↓ᴮ-inclusion : (x : ⟨ L ⟩) → small-↓ᴮ x → ⟨ L ⟩ small-↓ᴮ-inclusion x = β ∘ pr₁ small-↓ᴮ-≃-↓ᴮ : {x : ⟨ L ⟩} → small-↓ᴮ x ≃ ↓ᴮ x small-↓ᴮ-≃-↓ᴮ {x} = Σ-cong (λ _ → ≤ᴮ-≃-≤) ↓ᴮ-is-small : {x : ⟨ L ⟩} → ↓ᴮ x is 𝓥 small ↓ᴮ-is-small {x} = (small-↓ᴮ x , small-↓ᴮ-≃-↓ᴮ {x}) is-supᴮ' : (x : ⟨ L ⟩) → x = ⋁ (small-↓ᴮ x , small-↓ᴮ-inclusion x) is-supᴮ' x = reindexing-along-equiv-=-sup L small-↓ᴮ-≃-↓ᴮ (↓ᴮ-inclusion x) x (⋁ (small-↓ᴮ x , small-↓ᴮ-inclusion x)) (↓-is-sup x) (join-is-lub-of L (small-↓ᴮ x , small-↓ᴮ-inclusion x)) is-supᴮ : (x : ⟨ L ⟩) → (x is-lub-of (small-↓ᴮ x , small-↓ᴮ-inclusion x)) holds is-supᴮ x = transport (λ z → (z is-lub-of (small-↓ᴮ x , small-↓ᴮ-inclusion x)) holds) (is-supᴮ' x ⁻¹) (join-is-lub-of L ((small-↓ᴮ x , small-↓ᴮ-inclusion x))) is-upper-boundᴮ : (x : ⟨ L ⟩) → (x is-an-upper-bound-of (small-↓ᴮ x , small-↓ᴮ-inclusion x)) holds is-upper-boundᴮ x = pr₁ (is-supᴮ x) is-least-upper-boundᴮ : (x : ⟨ L ⟩) → ((u' , _) : upper-bound (small-↓ᴮ x , small-↓ᴮ-inclusion x)) → (x ≤ u') holds is-least-upper-boundᴮ x = pr₂ (is-supᴮ x) \end{code}