Tom de Jong, 8 & 15 January 2021 We construct the free 𝓥-sup-lattice on a set X : 𝓥 as the (𝓥-)powerset of X. \begin{code} {-# OPTIONS --safe --without-K #-} open import MLTT.Spartan open import UF.FunExt open import UF.Lower-FunExt open import UF.Powerset open import UF.PropTrunc open import UF.Sets open import UF.Subsingletons open import UF.Subsingletons-FunExt module OrderedTypes.FreeSupLattice (pt : propositional-truncations-exist) where open PropositionalTruncation pt \end{code} We define sup-lattices using a record. We also introduce convenient helpers and syntax for reasoning about the order ⊑. \begin{code} record SupLattice (𝓥 𝓤 𝓣 : Universe) : 𝓤ω where constructor lattice field L : 𝓤 ̇ L-is-set : is-set L _⊑_ : L → L → 𝓣 ̇ ⊑-is-prop-valued : (x y : L) → is-prop (x ⊑ y) ⊑-is-reflexive : (x : L) → x ⊑ x ⊑-is-transitive : (x y z : L) → x ⊑ y → y ⊑ z → x ⊑ z ⊑-is-antisymmetric : (x y : L) → x ⊑ y → y ⊑ x → x = y ⋁ : {I : 𝓥 ̇ } → (I → L) → L ⋁-is-upperbound : {I : 𝓥 ̇ } (α : I → L) (i : I) → α i ⊑ ⋁ α ⋁-is-lowerbound-of-upperbounds : {I : 𝓥 ̇ } (α : I → L) (x : L) → ((i : I) → α i ⊑ x) → ⋁ α ⊑ x transitivity' : (x : L) {y z : L} → x ⊑ y → y ⊑ z → x ⊑ z transitivity' x {y} {z} = ⊑-is-transitive x y z syntax transitivity' x u v = x ⊑⟨ u ⟩ v infixr 0 transitivity' reflexivity' : (x : L) → x ⊑ x reflexivity' x = ⊑-is-reflexive x syntax reflexivity' x = x ⊑∎ infix 1 reflexivity' =-to-⊑ : {x y : L} → x = y → x ⊑ y =-to-⊑ {x} {x} refl = reflexivity' x ⋁-transport : {I : 𝓥 ̇ } (α β : I → L) → α ∼ β → ⋁ α = ⋁ β ⋁-transport {I} α β H = ⊑-is-antisymmetric (⋁ α) (⋁ β) u v where u : ⋁ α ⊑ ⋁ β u = ⋁-is-lowerbound-of-upperbounds α (⋁ β) γ where γ : (i : I) → α i ⊑ ⋁ β γ i = α i ⊑⟨ =-to-⊑ (H i) ⟩ β i ⊑⟨ ⋁-is-upperbound β i ⟩ ⋁ β ⊑∎ v : ⋁ β ⊑ ⋁ α v = ⋁-is-lowerbound-of-upperbounds β (⋁ α) γ where γ : (i : I) → β i ⊑ ⋁ α γ i = β i ⊑⟨ =-to-⊑ (H i ⁻¹) ⟩ α i ⊑⟨ ⋁-is-upperbound α i ⟩ ⋁ α ⊑∎ \end{code} The powerset of X is an example of a sup-lattice and every subset can be written as a union of singletons (this will come in useful later). \begin{code} module _ (pe : propext 𝓥) (fe : funext 𝓥 (𝓥 ⁺)) (X : 𝓥 ̇ ) (X-is-set : is-set X) where open unions-of-small-families pt 𝓥 𝓥 X 𝓟-lattice : SupLattice 𝓥 (𝓥 ⁺) 𝓥 SupLattice.L 𝓟-lattice = 𝓟 X SupLattice.L-is-set 𝓟-lattice = powersets-are-sets fe pe SupLattice._⊑_ 𝓟-lattice = _⊆_ SupLattice.⊑-is-prop-valued 𝓟-lattice = ⊆-is-prop (lower-funext 𝓥 (𝓥 ⁺) fe) SupLattice.⊑-is-reflexive 𝓟-lattice = ⊆-refl SupLattice.⊑-is-transitive 𝓟-lattice = ⊆-trans SupLattice.⊑-is-antisymmetric 𝓟-lattice = (λ A B → subset-extensionality pe fe) SupLattice.⋁ 𝓟-lattice = ⋃ SupLattice.⋁-is-upperbound 𝓟-lattice = ⋃-is-upperbound SupLattice.⋁-is-lowerbound-of-upperbounds 𝓟-lattice = ⋃-is-lowerbound-of-upperbounds open singleton-subsets X-is-set express-subset-as-union-of-singletons : (A : 𝓟 X) → A = ⋃ (❴_❵ ∘ (𝕋-to-carrier A)) express-subset-as-union-of-singletons A = subset-extensionality pe fe u v where u : A ⊆ ⋃ (❴_❵ ∘ (𝕋-to-carrier A)) u x a = ∣ (x , a) , refl ∣ v : ⋃ (❴_❵ ∘ (𝕋-to-carrier A)) ⊆ A v x = ∥∥-rec (∈-is-prop A x) γ where γ : (Σ i ꞉ 𝕋 A , x ∈ (❴_❵ ∘ 𝕋-to-carrier A) i) → x ∈ A γ ((x , a) , refl) = a \end{code} Finally we will show that 𝓟 X is the free 𝓥-sup-lattice on a set X : 𝓥. Concretely, if L is a 𝓥-sup-lattice and f : X → L is any function, then there is a *unique* mediating map f♭ : 𝓟 X → L such that: (i) f♭ is a sup-lattice homomorphism, i.e. - f♭ preserves joins (of families indexed by types in 𝓥) (ii) the diagram f X ---------> L \ ^ \ / η \ / ∃! f♭ \ / v / 𝓟 X commutes. (The map η : X → 𝓟 X is of course given by x ↦ ❴ x ❵.) \begin{code} module _ (𝓛 : SupLattice 𝓥 𝓤 𝓣) where open SupLattice 𝓛 module _ (X : 𝓥 ̇ ) (X-is-set : is-set X) (f : X → L) where open singleton-subsets X-is-set open unions-of-small-families pt 𝓥 𝓥 X f̃ : (A : 𝓟 X) → 𝕋 A → L f̃ A = f ∘ (𝕋-to-carrier A) f♭ : 𝓟 X → L f♭ A = ⋁ {𝕋 A} (f̃ A) η : X → 𝓟 X η = ❴_❵ f♭-after-η-is-f : f♭ ∘ η ∼ f f♭-after-η-is-f x = ⊑-is-antisymmetric ((f♭ ∘ η) x) (f x) u v where u : (f♭ ∘ η) x ⊑ f x u = ⋁-is-lowerbound-of-upperbounds (f̃ (η x)) (f x) γ where γ : (i : 𝕋 (η x)) → (f̃ (η x)) i ⊑ f x γ (x , refl) = ⊑-is-reflexive (f x) v : f x ⊑ (f♭ ∘ η) x v = ⋁-is-upperbound (λ (x , _) → f x) (x , refl) f♭-is-monotone : (A B : 𝓟 X) → A ⊆ B → f♭ A ⊑ f♭ B f♭-is-monotone A B s = ⋁-is-lowerbound-of-upperbounds (f̃ A) (f♭ B) γ where γ : (i : Σ x ꞉ X , x ∈ A) → f̃ A i ⊑ ⋁ (f̃ B) γ (x , a) = ⋁-is-upperbound (f̃ B) (x , s x a) f♭-preserves-joins : (I : 𝓥 ̇ ) (α : I → 𝓟 X) → f♭ (⋃ α) = ⋁ (f♭ ∘ α) f♭-preserves-joins I α = ⊑-is-antisymmetric (f♭ (⋃ α)) (⋁ (f♭ ∘ α)) u v where u : ⋁ (f̃ (⋃ α)) ⊑ ⋁ (λ (i : I) → ⋁ (f̃ (α i))) u = ⋁-is-lowerbound-of-upperbounds (f̃ (⋃ α)) (⋁ (λ (i : I) → ⋁ (f̃ (α i)))) γ where γ : (p : (Σ x ꞉ X , x ∈ ⋃ α)) → f̃ (⋃ α) p ⊑ ⋁ (λ (i : I) → ⋁ (f̃ (α i))) γ (x , a) = ∥∥-rec (⊑-is-prop-valued _ _) ψ a where ψ : (Σ i ꞉ I , x ∈ α i) → f x ⊑ ⋁ (λ (i : I) → ⋁ (f̃ (α i))) ψ (i , a') = f x ⊑⟨ u₁ ⟩ ⋁ (f̃ (α i)) ⊑⟨ u₂ ⟩ ⋁ (λ (i : I) → ⋁ (f̃ (α i))) ⊑∎ where u₁ = ⋁-is-upperbound (f̃ (α i)) (x , a') u₂ = ⋁-is-upperbound (λ i' → ⋁ (f̃ (α i'))) i v : ⋁ (λ (i : I) → ⋁ (f̃ (α i))) ⊑ ⋁ (f̃ (⋃ α)) v = ⋁-is-lowerbound-of-upperbounds (λ i → ⋁ (f̃ (α i))) (⋁ (f̃ (⋃ α))) γ where γ : (i : I) → ⋁ (f̃ (α i)) ⊑ ⋁ (f̃ (⋃ α)) γ i = ⋁-is-lowerbound-of-upperbounds (f̃ (α i)) (⋁ (f̃ (⋃ α))) ψ where ψ : (p : Σ x ꞉ X , x ∈ α i) → f̃ (α i) p ⊑ ⋁ (f̃ (⋃ α)) ψ (x , a) = ⋁-is-upperbound (f̃ (⋃ α)) (x , ∣ i , a ∣) \end{code} Finally we prove that f♭ is the unique map with the above properties (i) & (ii). \begin{code} module _ (pe : propext 𝓥) (fe : funext 𝓥 (𝓥 ⁺)) where f♭-is-unique : (h : 𝓟 X → L) → ((I : 𝓥 ̇ ) (α : I → 𝓟 X) → h (⋃ α) = ⋁ (h ∘ α)) → (h ∘ η ∼ f) → h ∼ f♭ f♭-is-unique h p₁ p₂ A = h A =⟨ ap h (express-subset-as-union-of-singletons pe fe X X-is-set A) ⟩ h (⋃ (η ∘ pr₁)) =⟨ p₁ (𝕋 A) (η ∘ pr₁) ⟩ ⋁ (h ∘ η ∘ pr₁) =⟨ ⋁-transport (h ∘ η ∘ pr₁) (f ∘ pr₁) (λ p → p₂ (pr₁ p)) ⟩ ⋁ (f ∘ pr₁) =⟨ refl ⟩ f♭ A ∎ \end{code} Assuming some more function extensionality axioms, we can prove "homotopy uniqueness", i.e. the tuple consisting of f♭ together with the proofs of (i) and (ii) is unique. This follows easily from the above, because (i) and (ii) are subsingletons (as L is a set). \begin{code} module _ (pe : propext 𝓥) (fe : funext (𝓥 ⁺) (𝓥 ⁺ ⊔ 𝓤)) where homotopy-uniqueness-of-f♭ : ∃! h ꞉ (𝓟 X → L) , (((I : 𝓥 ̇ ) (α : I → 𝓟 X) → h (⋃ α) = ⋁ (h ∘ α))) × (h ∘ η ∼ f) homotopy-uniqueness-of-f♭ = (f♭ , f♭-preserves-joins , f♭-after-η-is-f) , γ where γ : (t : (Σ h ꞉ (𝓟 X → L) , (((I : 𝓥 ̇ ) (α : I → 𝓟 X) → h (⋃ α) = ⋁ (h ∘ α))) × (h ∘ η ∼ f))) → (f♭ , f♭-preserves-joins , f♭-after-η-is-f) = t γ (h , p₁ , p₂) = to-subtype-= ψ (dfunext (lower-funext (𝓥 ⁺) (𝓥 ⁺) fe) (λ A → (f♭-is-unique pe (lower-funext (𝓥 ⁺) 𝓤 fe) h p₁ p₂ A) ⁻¹)) where ψ : (k : 𝓟 X → L) → is-prop (((I : 𝓥 ̇ ) (α : I → 𝓟 X) → k (⋃ α) = ⋁ (k ∘ α)) × k ∘ η ∼ f) ψ k = ×-is-prop (Π-is-prop fe (λ _ → Π-is-prop (lower-funext (𝓥 ⁺) (𝓥 ⁺) fe) (λ _ → L-is-set))) (Π-is-prop (lower-funext (𝓥 ⁺) (𝓥 ⁺) fe) (λ _ → L-is-set)) \end{code}