Ian Ray 1 September 2023 -- edited 9 April 2024 We formalize Curi's notion of abstract inductive definition (in CZF) within the context of a sup-lattice L with small basis B (and β : B → L). An abstract inductive definition is a subset ϕ : B × L → Prop (in the TypeTopology library the type of propositions is denoted Ω) which can be thought of as a 'inference rule' concluding b from a (in the case ϕ(b,a) holds). An inductive definition induces a closure condition. For example, a subset S is closed under ϕ if for all b : B and a : L such that (b , a) ∈ ϕ and ↓ᴮa is 'contained' in S then b ∈ S. Interestingly, there is an intimate connection between the least-closed subsets of some inductive definition ϕ and the least fixed point of a monotone map related to ϕ. Constructing these least-closed subsets in traditional foundations is somewhat grueling. Fortunately, unlike in the realm of set theory, inductive constructions are first class citizens in a type theoretic setting. Using UF + HITs we can construct the least closed subset, under an inductive definition ϕ, as a special quotient inductive type (QIT). In this file we will develop this relationship and prove a predicative version of the least fixed point theorem. This work follows the paper 'On Tarski's Fixed Point Theorem' by Giovanni Curi: Giovanni Curi. "On Tarski's fixed point theorem". In: Proc. Amer. Math. Soc 143 (2015), pp. 4439-4455. DOI: http://doi.org/10.1090/proc/12569 For a write up of the present formalization in a type theoretic setting see https://arxiv.org/abs/2401.00841 The content of the present formalization works towards the following result. Predicative Least Fixed Point Theorem: Given a 𝓥-sup-lattice L with a 𝓥-presentation and a monotone endomap f : L → L. If there exists a bounded abstract inductive definition ϕ such that f = Γ ϕ, then f has a least fixed point. \begin{code} {-# OPTIONS --safe --without-K --exact-split #-} open import MLTT.Spartan open import UF.Equiv open import UF.Equiv-FunExt open import UF.EquivalenceExamples open import UF.FunExt open import UF.Logic open import UF.Powerset-MultiUniverse open import UF.PropTrunc open import UF.Subsingletons open import UF.Subsingletons-FunExt open import UF.SubtypeClassifier open import UF.Size open import UF.SmallnessProperties open import UF.UniverseEmbedding module OrderedTypes.PredicativeLFP (pt : propositional-truncations-exist) (fe : Fun-Ext) (pe : Prop-Ext) where private fe' : FunExt fe' 𝓤 𝓥 = fe {𝓤} {𝓥} open import Locales.Frame pt fe hiding (⟨_⟩ ; join-of) open import Slice.Family open import UF.ImageAndSurjection pt open import OrderedTypes.SupLattice pt fe open import OrderedTypes.SupLattice-SmallBasis pt fe open AllCombinators pt fe open PropositionalTruncation pt \end{code} We commence by defining what it means for a monotone endomap to have a least fixed point. \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} (L : Sup-Lattice 𝓤 𝓣 𝓥) where has-least-fixed-point : (f : ⟨ L ⟩ → ⟨ L ⟩) → 𝓤 ⊔ 𝓣 ̇ has-least-fixed-point f = Σ p ꞉ ⟨ L ⟩ , (f p = p) × ((a : ⟨ L ⟩) → (f a = a) → (p ≤⟨ L ⟩ a) holds) has-least-fixed-point-is-prop : (f : ⟨ L ⟩ → ⟨ L ⟩) → is-prop (has-least-fixed-point f) has-least-fixed-point-is-prop f (p₁ , fp₁ , l₁) (p₂ , fp₂ , l₂) = to-subtype-= (λ x → ×-is-prop (sethood-of L) (Π-is-prop fe (λ y → Π-is-prop fe (λ _ → holds-is-prop (x ≤⟨ L ⟩ y))))) (antisymmetry-of L (l₁ p₂ fp₂) (l₂ p₁ fp₁)) \end{code} We construct the least closed subset of an inductive definition as a QIT family. Since QITs (and more generally HITs) are not native in Agda we will instead assume the existence of such a type as well as its induction principle. Technically speaking we are going to use record types to package the contents of this QIT family. Notice all constructors are 'strictly positive' and the path constructors are 'natural' (see Chapter 6 Section 13 of the HoTT book https://homotopytypetheory.org/book/). Notice that the QIT family has two constructors which represent the closure conditions we wish to impose on subsets. The c-closure condition says: for any subset contained in the least closed subset, elements in the downset of its join are in the least closed subset as well. That is, Y is c-closed if for any U ⊆ Y we have ↓ᴮ (⋁ U) ⊆ Y. The ϕ-cl constructor says: if for any a : L and b : B with (b , a) ∈ ϕ and ↓ᴮ a 'contained' in the least closed subset then b is in the least closed subset. That is, Y is ϕ-closed if for any a : L and b : B we have (b , a) ∈ ϕ ∧ ↓ᴮ a ⊆ Y ⇒ b ∈ Y. It is worth noting that we don't encode the downsets as subsets in type theory (rather they are total spaces) so for that reason we won't encode the closure conditions exactly as above. TODO: Add syntax so the closure conditions more closely align with the naive description given above. We also derive the initiality of the least closed subset from the postulated induction principle. Initiality is closely related to the 'least' part of our least fixed point theorem. \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open Joins _≤_ open is-basis h \end{code} We give names to the closure conditions. \begin{code} c-closure : {𝓦 : Universe} (S : 𝓟 {𝓦} B) → (𝓥 ⁺) ⊔ 𝓦 ̇ c-closure S = (U : 𝓟 {𝓥} B) → U ⊆ S → (b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ S _closure : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → {𝓦 : Universe} (S : 𝓟 {𝓦} B) → 𝓤 ⊔ 𝓥 ⊔ 𝓦 ̇ (ϕ closure) S = (a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → ((b' : B) → (b' ≤ᴮ a → b' ∈ S)) → b ∈ S \end{code} The following record type should be interpreted as supplying the assumption that the QIT family exists with the apropriate 'initiality' principle (initiality is considerably weaker than an induction/recursion principle that one may expect). \begin{code} record inductively-generated-subset-exists (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)): 𝓤ω where constructor inductively-generated-subset field Ind : B → 𝓤 ⊔ 𝓥 ⁺ ̇ Ind-trunc : (b : B) → is-prop (Ind b) private 𝓘 : 𝓟 {𝓤 ⊔ 𝓥 ⁺} B 𝓘 b = (Ind b , Ind-trunc b) field c-closed : c-closure 𝓘 ϕ-closed : (ϕ closure) 𝓘 Ind-initial : (P : 𝓟 {𝓦} B) → c-closure P → (ϕ closure) P → 𝓘 ⊆ P module trunc-ind-def (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) (ind-e : inductively-generated-subset-exists ϕ) where open inductively-generated-subset-exists ind-e \end{code} We will now combine the postulated data above to form the least closed subset of B under some inductive definition ϕ and restate the closure properties and initiality in terms of it. \begin{code} 𝓘nd : 𝓟 {𝓤 ⊔ 𝓥 ⁺} B 𝓘nd b = (Ind b , Ind-trunc b) 𝓘nd-is-c-closed : c-closure 𝓘nd 𝓘nd-is-c-closed = c-closed 𝓘nd-is-ϕ-closed : (ϕ closure) 𝓘nd 𝓘nd-is-ϕ-closed = ϕ-closed 𝓘nd-is-initial : (P : 𝓟 {𝓦} B) → c-closure P → (ϕ closure) P → 𝓘nd ⊆ P 𝓘nd-is-initial = Ind-initial \end{code} We now consider a restricted class of inductive definitions which we will call local. A local inductive definition ϕ is one such that the type Σ b ꞉ B , (Ǝ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) is small. We then define an operator parameterized by local inductive definitions and prove that it is monotone. Finally, we show that any monotone endo map on a sup-lattice determines a monotone operator and corresponding local inductive definition. \begin{code} module local-inductive-definitions {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open Joins _≤_ open is-basis h \end{code} We now define an auxiliary subset/total space which we will use to define the upcoming monotone operator. This subset is in some sense a generalized downset that depends on ϕ. \begin{code} _↓_ : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → (a : ⟨ L ⟩) → 𝓤 ⊔ 𝓣 ⊔ 𝓥 ̇ ϕ ↓ a = Σ b ꞉ B , (Ǝ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds) holds ↓-to-base : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → (a : ⟨ L ⟩) → ϕ ↓ a → B ↓-to-base ϕ a = pr₁ ↓-monotonicity-lemma : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → (x y : ⟨ L ⟩) → (x ≤ y) holds → ϕ ↓ x → ϕ ↓ y ↓-monotonicity-lemma ϕ x y o (b , c) = (b , inclusion c) where inclusion : (Ǝ a' ꞉ ⟨ L ⟩ , ((b , a') ∈ ϕ) × ((a' ≤ x) holds)) holds → (Ǝ a' ꞉ ⟨ L ⟩ , ((b , a') ∈ ϕ) × ((a' ≤ y) holds)) holds inclusion = ∥∥-functor untrunc-inclusion where untrunc-inclusion : Σ a' ꞉ ⟨ L ⟩ , ((b , a') ∈ ϕ) × ((a' ≤ x) holds) → Σ a' ꞉ ⟨ L ⟩ , ((b , a') ∈ ϕ) × ((a' ≤ y) holds) untrunc-inclusion (a' , p , r) = (a' , p , transitivity-of L a' x y r o) ↓-has-sup-implies-monotone : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → (x y s s' : ⟨ L ⟩) → (x ≤ y) holds → (s is-lub-of (ϕ ↓ x , β ∘ ↓-to-base ϕ x)) holds → (s' is-lub-of (ϕ ↓ y , β ∘ ↓-to-base ϕ y)) holds → (s ≤ s') holds ↓-has-sup-implies-monotone ϕ x y s s' o (is-upbnd , is-least-upbnd) (is-upbnd' , is-least-upbnd') = is-least-upbnd (s' , s'-is-upbnd) where s'-is-upbnd : (s' is-an-upper-bound-of (ϕ ↓ x , β ∘ ↓-to-base ϕ x)) holds s'-is-upbnd (b , e) = is-upbnd' (↓-monotonicity-lemma ϕ x y o ((b , e))) is-local : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → 𝓤 ⊔ 𝓣 ⊔ (𝓥 ⁺) ̇ is-local ϕ = (a : ⟨ L ⟩) → (ϕ ↓ a) is 𝓥 small module _ (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) (i : is-local ϕ) where private S' : (a : ⟨ L ⟩) → 𝓥 ̇ S' a = resized (ϕ ↓ a) (i a) S'-equiv-↓ : (a : ⟨ L ⟩) → S' a ≃ ϕ ↓ a S'-equiv-↓ a = resizing-condition (i a) S'-to-↓ : (a : ⟨ L ⟩) → S' a → ϕ ↓ a S'-to-↓ a = ⌜ S'-equiv-↓ a ⌝ ↓-to-S' : (a : ⟨ L ⟩) → ϕ ↓ a → S' a ↓-to-S' a = ⌜ S'-equiv-↓ a ⌝⁻¹ S'-monotone-ish : (x y : ⟨ L ⟩) → (x ≤ y) holds → S' x → S' y S'-monotone-ish x y o = ↓-to-S' y ∘ ↓-monotonicity-lemma ϕ x y o ∘ S'-to-↓ x Γ : ⟨ L ⟩ → ⟨ L ⟩ Γ a = ⋁ (S' a , β ∘ pr₁ ∘ S'-to-↓ a) \end{code} We show that Γ is monotone. \begin{code} Γ-is-monotone : is-monotone-endomap L Γ Γ-is-monotone x y o = ↓-has-sup-implies-monotone ϕ x y (Γ x) (Γ y) o Γx-is-lub Γy-is-lub where Γx-is-lub : (Γ x is-lub-of (ϕ ↓ x , β ∘ ↓-to-base ϕ x)) holds Γx-is-lub = sup-of-small-fam-is-lub L (β ∘ ↓-to-base ϕ x) (i x) Γy-is-lub : (Γ y is-lub-of (ϕ ↓ y , β ∘ ↓-to-base ϕ y)) holds Γy-is-lub = sup-of-small-fam-is-lub L (β ∘ ↓-to-base ϕ y) (i y) \end{code} We now show that every monotone map determines and local inductive definition. \begin{code} monotone-map-give-local-ind-def : (f : ⟨ L ⟩ → ⟨ L ⟩) → is-monotone-endomap L f → Σ ϕ ꞉ 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩) , Σ i ꞉ (is-local ϕ) , ((x : ⟨ L ⟩) → (Γ ϕ i) x = f x) monotone-map-give-local-ind-def f f-mono = (ϕ , i , H) where ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩) ϕ (b , a) = (Lift 𝓤 (b ≤ᴮ f a) , equiv-to-prop (Lift-≃ 𝓤 (b ≤ᴮ f a)) ≤ᴮ-is-prop-valued) ↓ᴮf-equiv-↓-tot : (a : ⟨ L ⟩) → small-↓ᴮ (f a) ≃ ϕ ↓ a ↓ᴮf-equiv-↓-tot a = Σ-cong' (λ z → z ≤ᴮ f a) ((λ z → (Ǝ a' ꞉ ⟨ L ⟩ , (z , a') ∈ ϕ × (a' ≤ a) holds) holds)) ↓ᴮf-equiv-↓ where ↓ᴮf-equiv-↓ : (z : B) → (z ≤ᴮ f a) ≃ (Ǝ a' ꞉ ⟨ L ⟩ , (z , a') ∈ ϕ × (a' ≤ a) holds) holds ↓ᴮf-equiv-↓ z = ⌜ prop-≃-≃-↔ fe ≤ᴮ-is-prop-valued ∥∥-is-prop ⌝⁻¹ (↓ᴮf-to-↓ , ↓-to-↓ᴮf) where ↓ᴮf-to-↓ : z ≤ᴮ f a → (Ǝ a' ꞉ ⟨ L ⟩ , (z , a') ∈ ϕ × (a' ≤ a) holds) holds ↓ᴮf-to-↓ o = ∣ (a , ⌜ ≃-Lift 𝓤 (z ≤ᴮ f a) ⌝ o , reflexivity-of L a) ∣ ↓-to-↓ᴮf : (Ǝ a' ꞉ ⟨ L ⟩ , (z , a') ∈ ϕ × (a' ≤ a) holds) holds → z ≤ᴮ f a ↓-to-↓ᴮf = ∥∥-rec ≤ᴮ-is-prop-valued ↓-to-↓ᴮf' where ↓-to-↓ᴮf' : Σ a' ꞉ ⟨ L ⟩ , (z , a') ∈ ϕ × (a' ≤ a) holds → z ≤ᴮ f a ↓-to-↓ᴮf' (a' , o , r) = ≤-to-≤ᴮ (transitivity-of L (β z) (f a') (f a) (≤ᴮ-to-≤ (⌜ ≃-Lift 𝓤 (z ≤ᴮ f a') ⌝⁻¹ o)) (f-mono a' a r)) i : is-local ϕ i a = (small-↓ᴮ (f a) , ↓ᴮf-equiv-↓-tot a) G : (x : ⟨ L ⟩) → (f x is-lub-of (ϕ ↓ x , β ∘ ↓-to-base ϕ x)) holds G x = (fx-is-upbnd , fx-is-least-upbnd) where fx-is-upbnd : (f x is-an-upper-bound-of (ϕ ↓ x , β ∘ ↓-to-base ϕ x)) holds fx-is-upbnd (b , e) = ↓-to-fx-upbnd e where ↓-to-fx-upbnd : (Ǝ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ x) holds) holds → (β b ≤ f x) holds ↓-to-fx-upbnd = ∥∥-rec (holds-is-prop (β b ≤ f x)) ↓-to-fx-upbnd' where ↓-to-fx-upbnd' : Σ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ x) holds → (β b ≤ f x) holds ↓-to-fx-upbnd' (a' , o , r) = transitivity-of L (β b) (f a') (f x) (≤ᴮ-to-≤ (⌜ ≃-Lift 𝓤 (b ≤ᴮ f a') ⌝⁻¹ o)) (f-mono a' x r) fx-is-least-upbnd : ((u , _) : upper-bound (ϕ ↓ x , β ∘ ↓-to-base ϕ x)) → (f x ≤ u) holds fx-is-least-upbnd (u , is-upbnd) = (is-least-upper-boundᴮ (f x)) (u , λ z → is-upbnd (⌜ ↓ᴮf-equiv-↓-tot x ⌝ z)) H : (x : ⟨ L ⟩) → (Γ ϕ i) x = f x H x = reindexing-along-equiv-=-sup L (id , id-is-equiv (ϕ ↓ x)) (β ∘ ↓-to-base ϕ x) ((Γ ϕ i) x) (f x) (sup-of-small-fam-is-lub L (β ∘ ↓-to-base ϕ x) (i x)) (G x) ind-def-from-monotone-map : (f : ⟨ L ⟩ → ⟨ L ⟩) → is-monotone-endomap L f → 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩) ind-def-from-monotone-map f f-mono = pr₁ (monotone-map-give-local-ind-def f f-mono) local-from-monotone-map : (f : ⟨ L ⟩ → ⟨ L ⟩) → (f-mono : is-monotone-endomap L f) → is-local (ind-def-from-monotone-map f f-mono) local-from-monotone-map f f-mono = pr₁ (pr₂ (monotone-map-give-local-ind-def f f-mono)) local-ind-def-is-section-of-Γ : (f : ⟨ L ⟩ → ⟨ L ⟩) → (f-mono : is-monotone-endomap L f) → (x : ⟨ L ⟩) → (Γ (ind-def-from-monotone-map f f-mono) (local-from-monotone-map f f-mono)) x = f x local-ind-def-is-section-of-Γ f f-mono = pr₂ (pr₂ (monotone-map-give-local-ind-def f f-mono)) \end{code} We now spell out the correspondence between small 'closed' subsets and deflationary points in our sup-lattice. This will allow us to show that monotone operators have a least fixed point under certain smallness assumpions. \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open Joins _≤_ open is-basis h open local-inductive-definitions L β h module correspondance-from-locally-small-ϕ (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) (i : is-local ϕ) where \end{code} Next we give a name to the type of subsets of size 𝓥 (small) that are c-closed and ϕ-closed (recall, that closure was initially defined for subsets with respect to an arbitrary universe parameter 𝓣.) \begin{code} is-small-closed-subset : (P : 𝓟 {𝓥} B) → 𝓤 ⊔ (𝓥 ⁺) ̇ is-small-closed-subset P = ((U : 𝓟 {𝓥} B) → (U ⊆ P) → ((b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ P)) × ((a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → ((b' : B) → (b' ≤ᴮ a → b' ∈ P)) → b ∈ P) is-small-closed-subset-is-predicate : (P : 𝓟 {𝓥} B) → is-prop (is-small-closed-subset P) is-small-closed-subset-is-predicate P = ×-is-prop (Π₄-is-prop fe (λ _ _ b _ → holds-is-prop (P b))) (Π₄-is-prop fe (λ _ b _ _ → holds-is-prop (P b))) small-closed-subsets : 𝓤 ⊔ (𝓥 ⁺) ̇ small-closed-subsets = Σ P ꞉ 𝓟 {𝓥} B , is-small-closed-subset P subset-of-small-closed-subset : small-closed-subsets → 𝓟 {𝓥} B subset-of-small-closed-subset (P , c-clsd , ϕ-clsd) = P c-closed-of-small-closed-subset : (X : small-closed-subsets) → ((U : 𝓟 {𝓥} B) → U ⊆ subset-of-small-closed-subset X → ((b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ subset-of-small-closed-subset X)) c-closed-of-small-closed-subset (P , c-clsd , ϕ-clsd) = c-clsd ϕ-closed-of-small-closed-subset : (X : small-closed-subsets) → ((a : ⟨ L ⟩) → (b : B) → ((b , a) ∈ ϕ) → ((b' : B) → (b' ≤ᴮ a → b' ∈ subset-of-small-closed-subset X)) → b ∈ subset-of-small-closed-subset X) ϕ-closed-of-small-closed-subset (P , c-clsd , ϕ-clsd) = ϕ-clsd is-deflationary : (a : ⟨ L ⟩) → 𝓣 ̇ is-deflationary a = ((Γ ϕ i) a ≤ a) holds is-deflationary-is-predicate : (a : ⟨ L ⟩) → is-prop (is-deflationary a) is-deflationary-is-predicate a = holds-is-prop ((Γ ϕ i) a ≤ a) deflationary-points : 𝓤 ⊔ 𝓣 ̇ deflationary-points = Σ a ꞉ ⟨ L ⟩ , (is-deflationary a) point-def-points : deflationary-points → ⟨ L ⟩ point-def-points (a , _) = a is-deflationary-def-points : (X : deflationary-points) → is-deflationary (point-def-points X) is-deflationary-def-points (_ , dp) = dp small-closed-subsets-to-def-points : small-closed-subsets → deflationary-points small-closed-subsets-to-def-points (P , c-closed , ϕ-closed) = (sup-of-P , sup-is-def) where sup-of-P : ⟨ L ⟩ sup-of-P = ⋁ 【 β , P 】 sup-is-def : is-deflationary sup-of-P sup-is-def = lub-condition (sup-of-P , is-upper-bound) where sup-is-lub : ((Γ ϕ i) sup-of-P is-lub-of (ϕ ↓ sup-of-P , β ∘ ↓-to-base ϕ sup-of-P)) holds sup-is-lub = sup-of-small-fam-is-lub L (β ∘ ↓-to-base ϕ sup-of-P) (i sup-of-P) lub-condition : ((u , _) : upper-bound (ϕ ↓ sup-of-P , β ∘ ↓-to-base ϕ sup-of-P)) → ((Γ ϕ i) sup-of-P ≤ u) holds lub-condition = pr₂ sup-is-lub b-in-P-to-b-below-sup : (b : B) → b ∈ P → (β b ≤ sup-of-P) holds b-in-P-to-b-below-sup b b-in-P = (join-is-upper-bound-of L 【 β , P 】) (b , b-in-P) un-trunc-map : (b : B) → Σ a ꞉ ⟨ L ⟩ , (b , a) ∈ ϕ × (a ≤ sup-of-P) holds → (β b ≤ sup-of-P) holds un-trunc-map b (a , p , o) = b-in-P-to-b-below-sup b (ϕ-closed a b p (ϕ-hypothesis)) where ϕ-hypothesis : (b' : B) → b' ≤ᴮ a → b' ∈ P ϕ-hypothesis b' r = c-closed P (λ x → id) b' b'-below-sup-P where b'-below-sup-P : b' ≤ᴮ sup-of-P b'-below-sup-P = ≤-to-≤ᴮ (transitivity-of L (β b') a sup-of-P (≤ᴮ-to-≤ r) o) is-upper-bound : ((b , e) : ϕ ↓ sup-of-P) → (β b ≤ sup-of-P) holds is-upper-bound (b , e) = ∥∥-rec (holds-is-prop (β b ≤ sup-of-P)) (un-trunc-map b) e def-points-to-small-closed-subsets : deflationary-points → small-closed-subsets def-points-to-small-closed-subsets (a , is-def) = (Q a , c-closed , ϕ-closed) where Q : (x : ⟨ L ⟩) → 𝓟 {𝓥} B Q x b = (b ≤ᴮ x , ≤ᴮ-is-prop-valued) sup-Q_ : (x : ⟨ L ⟩) → ⟨ L ⟩ sup-Q x = ⋁ 【 β , Q x 】 _is-sup-Q : (x : ⟨ L ⟩) → x = sup-Q x x is-sup-Q = is-supᴮ' x c-closed : (U : 𝓟 {𝓥} B) → (U ⊆ Q a) → ((b : B) → (b ≤ᴮ (⋁ 【 β , U 】)) → b ∈ Q a) c-closed U C b o = ≤-to-≤ᴮ (transitivity-of L (β b) (⋁ 【 β , U 】) a (≤ᴮ-to-≤ o) (transport (λ - → ((⋁ 【 β , U 】) ≤ -) holds) (a is-sup-Q ⁻¹) (joins-preserve-containment L β {U} {Q a} C))) ϕ-closed : (a' : ⟨ L ⟩) → (b : B) → ((b , a') ∈ ϕ) → ((b' : B) → (b' ≤ᴮ a' → b' ∈ Q a)) → b ∈ Q a ϕ-closed a' b p f = trunc-map b ∣ (a' , p , a'-below-a) ∣ where Γ-is-sup : ((Γ ϕ i) a is-lub-of (ϕ ↓ a , β ∘ ↓-to-base ϕ a)) holds Γ-is-sup = sup-of-small-fam-is-lub L (β ∘ ↓-to-base ϕ a) (i a) Γ-an-upper-bound : ((Γ ϕ i) a is-an-upper-bound-of (ϕ ↓ a , β ∘ ↓-to-base ϕ a)) holds Γ-an-upper-bound = pr₁ Γ-is-sup trunc-map : (x : B) → (Ǝ a'' ꞉ ⟨ L ⟩ , (x , a'') ∈ ϕ × (a'' ≤ a) holds) holds → x ≤ᴮ a trunc-map x e = ≤-to-≤ᴮ (transitivity-of L (β x) ((Γ ϕ i) a) a (Γ-an-upper-bound (x , e)) (is-def)) a'-below-a : (a' ≤ a) holds a'-below-a = transport (λ - → (- ≤ a) holds) (a' is-sup-Q ⁻¹) (transport (λ - → ((sup-Q a') ≤ -) holds) (a is-sup-Q ⁻¹) (joins-preserve-containment L β {Q a'} {Q a} f)) small-closed-subsets-≃-def-points : small-closed-subsets ≃ deflationary-points small-closed-subsets-≃-def-points = (small-closed-subsets-to-def-points , qinvs-are-equivs small-closed-subsets-to-def-points is-qinv) where H : def-points-to-small-closed-subsets ∘ small-closed-subsets-to-def-points ∼ id H (P , c-closed , ϕ-closed) = to-subtype-= is-small-closed-subset-is-predicate P'-is-P where sup-P : ⟨ L ⟩ sup-P = point-def-points (small-closed-subsets-to-def-points (P , c-closed , ϕ-closed)) P' : 𝓟 {𝓥} B P' = subset-of-small-closed-subset (def-points-to-small-closed-subsets (small-closed-subsets-to-def-points (P , c-closed , ϕ-closed))) P'-is-P : P' = P P'-is-P = dfunext fe P'-htpy-P where P'-htpy-P : P' ∼ P P'-htpy-P x = to-Ω-= fe (pe ≤ᴮ-is-prop-valued (holds-is-prop (P x)) P'-to-P P-to-P') where P'-to-P : x ≤ᴮ sup-P → x ∈ P P'-to-P = c-closed P (λ _ → id) x P-to-P' : x ∈ P → x ≤ᴮ sup-P P-to-P' r = ≤-to-≤ᴮ ((join-is-upper-bound-of L 【 β , P 】) (x , r)) G : small-closed-subsets-to-def-points ∘ def-points-to-small-closed-subsets ∼ id G (a , is-def) = to-subtype-= is-deflationary-is-predicate sup-P-is-a where P : 𝓟 {𝓥} B P = subset-of-small-closed-subset (def-points-to-small-closed-subsets (a , is-def)) sup-P : ⟨ L ⟩ sup-P = point-def-points (small-closed-subsets-to-def-points (def-points-to-small-closed-subsets (a , is-def))) sup-P-is-a : sup-P = a sup-P-is-a = is-supᴮ' a ⁻¹ is-qinv : qinv small-closed-subsets-to-def-points is-qinv = (def-points-to-small-closed-subsets , H , G) \end{code} Using the previously displayed correspondance we can show that, under certain smallness assumptions on the least closed subset 𝓘nd ϕ, the monotone operator Γ ϕ has a least fixed point. \begin{code} module small-𝓘nd-from-exists (ind-e : inductively-generated-subset-exists L β h ϕ) where open inductively-generated-subset-exists ind-e open trunc-ind-def L β h ϕ ind-e module smallness-assumption (j : (b : B) → (b ∈ 𝓘nd) is 𝓥 small) where private 𝓘' : (b : B) → 𝓥 ̇ 𝓘' b = (resized (b ∈ 𝓘nd)) (j b) 𝓘'-equiv-𝓘nd : (b : B) → 𝓘' b ≃ b ∈ 𝓘nd 𝓘'-equiv-𝓘nd b = resizing-condition (j b) 𝓘'-to-𝓘nd : (b : B) → 𝓘' b → b ∈ 𝓘nd 𝓘'-to-𝓘nd b = ⌜ 𝓘'-equiv-𝓘nd b ⌝ 𝓘nd-to-𝓘' : (b : B) → b ∈ 𝓘nd → 𝓘' b 𝓘nd-to-𝓘' b = ⌜ 𝓘'-equiv-𝓘nd b ⌝⁻¹ 𝓘'-is-prop-valued : {b : B} → is-prop (𝓘' b) 𝓘'-is-prop-valued {b} = equiv-to-prop (𝓘'-equiv-𝓘nd b) (Ind-trunc b) 𝓘'-subset : 𝓟 {𝓥} B 𝓘'-subset = λ b → (𝓘' b , 𝓘'-is-prop-valued) 𝓘'-is-c-closed : (U : 𝓟 {𝓥} B) → U ⊆ 𝓘'-subset → (b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ 𝓘'-subset 𝓘'-is-c-closed U C b o = 𝓘nd-to-𝓘' b (𝓘nd-is-c-closed U (λ x → 𝓘'-to-𝓘nd x ∘ C x) b o) 𝓘'-is-ϕ-closed : (a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → ((b' : B) → b' ≤ᴮ a → b' ∈ 𝓘'-subset) → b ∈ 𝓘'-subset 𝓘'-is-ϕ-closed a b p f = 𝓘nd-to-𝓘' b (𝓘nd-is-ϕ-closed a b p (λ b' → 𝓘'-to-𝓘nd b' ∘ f b')) total-space-𝓘-is-small : (𝕋 𝓘nd) is 𝓥 small total-space-𝓘-is-small = (𝕋 𝓘'-subset , Σ-cong λ b → 𝓘'-equiv-𝓘nd b) e : 𝕋 𝓘'-subset ≃ 𝕋 𝓘nd e = resizing-condition total-space-𝓘-is-small sup-𝓘 : ⟨ L ⟩ sup-𝓘 = ⋁ (𝕋 𝓘'-subset , β ∘ 𝕋-to-carrier 𝓘nd ∘ ⌜ e ⌝) sup-𝓘-is-lub : (sup-𝓘 is-lub-of 【 β , 𝓘nd 】) holds sup-𝓘-is-lub = sup-of-small-fam-is-lub L (β ∘ 𝕋-to-carrier 𝓘nd) total-space-𝓘-is-small sup-𝓘-is-fixed-point : (Γ ϕ i) sup-𝓘 = sup-𝓘 sup-𝓘-is-fixed-point = antisymmetry-of L Γ-sup-below-sup sup-below-Γ-sup where Γ-sup-below-sup : ((Γ ϕ i) sup-𝓘 ≤ sup-𝓘) holds Γ-sup-below-sup = is-deflationary-def-points (small-closed-subsets-to-def-points (𝓘'-subset , 𝓘'-is-c-closed , 𝓘'-is-ϕ-closed)) sup-below-Γ-sup : (sup-𝓘 ≤ (Γ ϕ i) sup-𝓘) holds sup-below-Γ-sup = transport (λ - → (sup-𝓘 ≤ -) holds) sup-Q-is-Γ-sup sup-𝓘-below-sup-Q where Γ-Γ-sup-below-Γ-sup : ((Γ ϕ i) ((Γ ϕ i) sup-𝓘) ≤ (Γ ϕ i) sup-𝓘) holds Γ-Γ-sup-below-Γ-sup = Γ-is-monotone ϕ i ((Γ ϕ i) sup-𝓘) sup-𝓘 Γ-sup-below-sup Q-Γ-sup : 𝓟 {𝓥} B Q-Γ-sup = subset-of-small-closed-subset (def-points-to-small-closed-subsets ((Γ ϕ i) sup-𝓘 , Γ-Γ-sup-below-Γ-sup)) Q-is-c-closed : (U : 𝓟 {𝓥} B) → (U ⊆ Q-Γ-sup) → ((b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ Q-Γ-sup) Q-is-c-closed = c-closed-of-small-closed-subset (def-points-to-small-closed-subsets ((Γ ϕ i) sup-𝓘 , Γ-Γ-sup-below-Γ-sup)) Q-is-ϕ-closed : (a' : ⟨ L ⟩) → (b : B) → ((b , a') ∈ ϕ) → ((b' : B) → (b' ≤ᴮ a' → b' ∈ Q-Γ-sup)) → b ∈ Q-Γ-sup Q-is-ϕ-closed = ϕ-closed-of-small-closed-subset (def-points-to-small-closed-subsets ((Γ ϕ i) sup-𝓘 , Γ-Γ-sup-below-Γ-sup)) 𝓘nd-contained-Q-Γ-sup : 𝓘nd ⊆ Q-Γ-sup 𝓘nd-contained-Q-Γ-sup = 𝓘nd-is-initial Q-Γ-sup Q-is-c-closed Q-is-ϕ-closed 𝓘-is-small-subset-contained-Q-Γ-sup : 𝓘'-subset ⊆ Q-Γ-sup 𝓘-is-small-subset-contained-Q-Γ-sup = (λ z → 𝓘nd-contained-Q-Γ-sup z ∘ 𝓘'-to-𝓘nd z) sup-Q : ⟨ L ⟩ sup-Q = ⋁ 【 β , Q-Γ-sup 】 sup-𝓘-below-sup-Q : (sup-𝓘 ≤ sup-Q) holds sup-𝓘-below-sup-Q = joins-preserve-containment L β {𝓘'-subset} {Q-Γ-sup} 𝓘-is-small-subset-contained-Q-Γ-sup sup-Q-is-Γ-sup : sup-Q = (Γ ϕ i) sup-𝓘 sup-Q-is-Γ-sup = is-supᴮ' ((Γ ϕ i) sup-𝓘) ⁻¹ sup-𝓘-is-least-fixed-point : (a : ⟨ L ⟩) → (Γ ϕ i) a = a → (sup-𝓘 ≤⟨ L ⟩ a) holds sup-𝓘-is-least-fixed-point a p = transport (λ - → (sup-𝓘 ≤ -) holds) sup-P-is-a sup-𝓘-below-sup-P where Γa-below-a : ((Γ ϕ i) a ≤ a) holds Γa-below-a = transport (λ - → ((Γ ϕ i) a ≤ -) holds) p (reflexivity-of L ((Γ ϕ i) a)) P-a : 𝓟 {𝓥} B P-a = subset-of-small-closed-subset (def-points-to-small-closed-subsets (a , Γa-below-a)) P-is-c-closed : (U : 𝓟 {𝓥} B) → (U ⊆ P-a) → ((b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ P-a) P-is-c-closed = c-closed-of-small-closed-subset (def-points-to-small-closed-subsets (a , Γa-below-a)) P-is-ϕ-closed : (a' : ⟨ L ⟩) → (b : B) → ((b , a') ∈ ϕ) → ((b' : B) → (b' ≤ᴮ a' → b' ∈ P-a)) → b ∈ P-a P-is-ϕ-closed = ϕ-closed-of-small-closed-subset (def-points-to-small-closed-subsets (a , Γa-below-a)) 𝓘nd-contained-P-a : 𝓘nd ⊆ P-a 𝓘nd-contained-P-a = 𝓘nd-is-initial P-a P-is-c-closed P-is-ϕ-closed 𝓘'-subset-contained-P-a : 𝓘'-subset ⊆ P-a 𝓘'-subset-contained-P-a = λ z → 𝓘nd-contained-P-a z ∘ 𝓘'-to-𝓘nd z sup-P : ⟨ L ⟩ sup-P = ⋁ 【 β , P-a 】 sup-𝓘-below-sup-P : (sup-𝓘 ≤ sup-P) holds sup-𝓘-below-sup-P = joins-preserve-containment L β {𝓘'-subset} {P-a} 𝓘'-subset-contained-P-a sup-P-is-a : sup-P = a sup-P-is-a = is-supᴮ' a ⁻¹ Γ-has-least-fixed-point : has-least-fixed-point L (Γ ϕ i) Γ-has-least-fixed-point = (sup-𝓘 , sup-𝓘-is-fixed-point , sup-𝓘-is-least-fixed-point) where sup-𝓘-below : (a : ⟨ L ⟩) → ((Γ ϕ i) a = a) → (sup-𝓘 ≤ a) holds sup-𝓘-below a p = transport (λ - → (sup-𝓘 ≤ -) holds) sup-P-is-a sup-𝓘-below-sup-P where Γa-below-a : ((Γ ϕ i) a ≤ a) holds Γa-below-a = transport (λ - → ((Γ ϕ i) a ≤ -) holds) p (reflexivity-of L ((Γ ϕ i) a)) P-a : 𝓟 {𝓥} B P-a = subset-of-small-closed-subset (def-points-to-small-closed-subsets (a , Γa-below-a)) P-is-c-closed : (U : 𝓟 {𝓥} B) → (U ⊆ P-a) → ((b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ P-a) P-is-c-closed = c-closed-of-small-closed-subset (def-points-to-small-closed-subsets (a , Γa-below-a)) P-is-ϕ-closed : (a' : ⟨ L ⟩) → (b : B) → ((b , a') ∈ ϕ) → ((b' : B) → (b' ≤ᴮ a' → b' ∈ P-a)) → b ∈ P-a P-is-ϕ-closed = ϕ-closed-of-small-closed-subset (def-points-to-small-closed-subsets (a , Γa-below-a)) 𝓘nd-contained-P-a : 𝓘nd ⊆ P-a 𝓘nd-contained-P-a = 𝓘nd-is-initial P-a P-is-c-closed P-is-ϕ-closed 𝓘'-subset-contained-P-a : 𝓘'-subset ⊆ P-a 𝓘'-subset-contained-P-a = λ z → 𝓘nd-contained-P-a z ∘ 𝓘'-to-𝓘nd z sup-P : ⟨ L ⟩ sup-P = ⋁ 【 β , P-a 】 sup-𝓘-below-sup-P : (sup-𝓘 ≤ sup-P) holds sup-𝓘-below-sup-P = joins-preserve-containment L β {𝓘'-subset} {P-a} 𝓘'-subset-contained-P-a sup-P-is-a : sup-P = a sup-P-is-a = is-supᴮ' a ⁻¹ \end{code} The remainder of this formalization is essentially a search for restrictions we may impose on sup-lattices and inductive definitions to achieve the neccesary smallness assumptions on 𝓘nd which will guarentee least fixed points. We now consider a boundedness restricion on inductive definitions and show that bounded inductive definitions are local. An inductive definition is bounded if there is a small indexed family of types that can be substituted for elements a : L in a sense to be made precise below. \begin{code} module bounded-inductive-definitions {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open Joins _≤_ open local-inductive-definitions L β h open is-basis h _is-a-small-cover-of_ : (X : 𝓥 ̇) → (Y : 𝓦 ̇) → 𝓥 ⊔ 𝓦 ̇ X is-a-small-cover-of Y = X ↠ Y has-a-bound : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → 𝓤 ⊔ 𝓣 ⊔ (𝓥 ⁺) ̇ has-a-bound ϕ = Σ I ꞉ 𝓥 ̇ , Σ α ꞉ (I → 𝓥 ̇) , ((a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → (Ǝ i ꞉ I , α i is-a-small-cover-of ↓ᴮ L β a) holds) bound-index : {ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)} → has-a-bound ϕ → 𝓥 ̇ bound-index (I , α , covering) = I bound-family : {ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)} → (bnd : has-a-bound ϕ) → (bound-index {ϕ} bnd → 𝓥 ̇) bound-family (I , α , covering) = α covering-condition : {ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)} → (bnd : has-a-bound ϕ) → ((a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → (Ǝ i ꞉ (bound-index {ϕ} bnd) , ((bound-family {ϕ} bnd) i is-a-small-cover-of ↓ᴮ L β a)) holds) covering-condition (I , α , covering) = covering is-bounded : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → 𝓤 ⊔ 𝓣 ⊔ (𝓥 ⁺) ̇ is-bounded ϕ = ((a : ⟨ L ⟩) → (b : B) → ((b , a) ∈ ϕ) is 𝓥 small) × (has-a-bound ϕ) bounded-implies-local : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → is-bounded ϕ → is-local ϕ bounded-implies-local ϕ (ϕ-small , ϕ-has-bound) a = smallness-closed-under-≃ S₀-is-small S₀-equiv-↓ where I : 𝓥 ̇ I = bound-index {ϕ} ϕ-has-bound α : I → 𝓥 ̇ α = bound-family {ϕ} ϕ-has-bound cov : (a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → (Ǝ i ꞉ I , (α i is-a-small-cover-of ↓ᴮ L β a)) holds cov = covering-condition {ϕ} ϕ-has-bound S₀ : 𝓤 ⊔ 𝓣 ⊔ 𝓥 ̇ S₀ = Σ b ꞉ B , (Ǝ i ꞉ I , (Σ m ꞉ (α i → ↓ᴮ L β a) , (b , ⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) ∈ ϕ)) holds S₀-is-small : S₀ is 𝓥 small S₀-is-small = Σ-is-small (B , ≃-refl B) (λ b → ∥∥-is-small pt (Σ-is-small (I , ≃-refl I) (λ i → Σ-is-small (Π-is-small fe' (α i , ≃-refl (α i)) (λ _ → ↓ᴮ-is-small)) (λ m → ϕ-small (⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) b)))) S₀-to-↓ : S₀ → ϕ ↓ a S₀-to-↓ (b , e) = (b , ∥∥-functor u e) where u : Σ i ꞉ I , Σ m ꞉ (α i → ↓ᴮ L β a) , (b , (⋁ (α i , ↓ᴮ-inclusion L β a ∘ m))) ∈ ϕ → Σ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds u (i , m , p) = (⋁ (α i , ↓ᴮ-inclusion L β a ∘ m) , p , join-is-least-upper-bound-of L (α i , ↓ᴮ-inclusion L β a ∘ m) (a , λ z → is-upper-bound-↓ a (m z))) ↓-to-S₀ : ϕ ↓ a → S₀ ↓-to-S₀ (b , e) = (b , t e) where g : (a' : ⟨ L ⟩) → (b , a') ∈ ϕ → (a' ≤ a) holds → Σ i ꞉ I , (α i is-a-small-cover-of ↓ᴮ L β a') → Σ i ꞉ I , (Σ m ꞉ (α i → ↓ᴮ L β a) , (b , ⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) ∈ ϕ) g a' p o (i , α-covers) = (i , m , in-ϕ) where inclusion : (a' : ⟨ L ⟩) → (a' ≤ a) holds → ↓ᴮ L β a' → ↓ᴮ L β a inclusion a' o (x , r) = (x , transitivity-of L (β x) a' a r o) m : α i → ↓ᴮ L β a m = inclusion a' o ∘ ⌞ α-covers ⌟ path : a' = ⋁ (α i , ↓ᴮ-inclusion L β a ∘ m) path = reindexing-along-surj-=-sup L α-covers (β ∘ pr₁) a' (⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) (↓-is-sup a') (join-is-lub-of L (α i , ↓ᴮ-inclusion L β a ∘ m)) in-ϕ : (b , ⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) ∈ ϕ in-ϕ = transport (λ z → (b , z) ∈ ϕ) path p trunc-g : (a' : ⟨ L ⟩) → (b , a') ∈ ϕ → (a' ≤ a) holds → (Ǝ i ꞉ I , (α i is-a-small-cover-of ↓ᴮ L β a')) holds → (Ǝ i ꞉ I , (Σ m ꞉ (α i → ↓ᴮ L β a) , (b , ⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) ∈ ϕ)) holds trunc-g a' p o = ∥∥-functor (g a' p o) cur-trunc-g : Σ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds → (Ǝ i ꞉ I , Σ m ꞉ (α i → ↓ᴮ L β a) , (b , ⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) ∈ ϕ) holds cur-trunc-g (a' , p , o) = trunc-g a' p o (cov a' b p) t : (Ǝ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds) holds → (Ǝ i ꞉ I , Σ m ꞉ (α i → ↓ᴮ L β a) , (b , ⋁ (α i , ↓ᴮ-inclusion L β a ∘ m)) ∈ ϕ) holds t = ∥∥-rec ∥∥-is-prop cur-trunc-g S₀-equiv-↓ : S₀ ≃ ϕ ↓ a S₀-equiv-↓ = (S₀-to-↓ , qinvs-are-equivs S₀-to-↓ is-qinv) where H : ↓-to-S₀ ∘ S₀-to-↓ ∼ id H (b , e) = to-subtype-= (λ _ → ∥∥-is-prop) refl G : S₀-to-↓ ∘ ↓-to-S₀ ∼ id G (b , e) = to-subtype-= (λ _ → ∥∥-is-prop) refl is-qinv : qinv S₀-to-↓ is-qinv = (↓-to-S₀ , H , G) \end{code} We now consider a presentation restriction on sup-lattices stronger than having a basis. A sup-lattice has a small presentation if there is a small indexed family of subsets that can be substituted for arbitrary subsets in a sense to be made precise below. \begin{code} module small-presentation-of-lattice {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open Joins _≤_ open PropositionalTruncation pt open is-basis h _is-a-small-presentation : Σ J ꞉ 𝓥 ̇ , (J → 𝓟 {𝓥} B) × 𝓟 {𝓥} (B × 𝓟 {𝓥} B) → (𝓥 ⁺) ̇ (J , Y , R) is-a-small-presentation = (b : B) → (X : 𝓟 {𝓥} B) → b ≤ᴮ (⋁ 【 β , X 】) ≃ ((Ǝ j ꞉ J , Y j ⊆ X × (b , Y j) ∈ R) holds) has-small-presentation : (𝓥 ⁺) ̇ has-small-presentation = Σ 𝓡 ꞉ Σ J ꞉ 𝓥 ̇ , (J → 𝓟 {𝓥} B) × 𝓟 {𝓥} (B × 𝓟 {𝓥} B) , 𝓡 is-a-small-presentation \end{code} We will now define, in the context of bounded ϕ and small-presentation 𝓡, a new QIT family that is equivalent to 𝓘nd. Our constructors should be familiar but notice the bounded and small-presentation assumptions allow us to avoid large quantification! \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open bounded-inductive-definitions L β h open small-presentation-of-lattice L β h open is-basis h module small-QIT-from-bounded-and-small-presentation (small-pres : has-small-presentation) (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) (bnd : is-bounded ϕ) where I₁ : 𝓥 ̇ I₁ = pr₁ (pr₁ small-pres) Y : I₁ → 𝓟 {𝓥} B Y = pr₁ (pr₂ (pr₁ small-pres)) R : 𝓟 {𝓥} (B × 𝓟 {𝓥} B) R = pr₂ (pr₂ (pr₁ small-pres)) is-small-pres : (I₁ , Y , R) is-a-small-presentation is-small-pres = pr₂ small-pres is-small-pres-forward : (b : B) → (X : 𝓟 {𝓥} B) → b ≤ᴮ (⋁ 【 β , X 】) → ((Ǝ j ꞉ I₁ , Y j ⊆ X × (b , Y j) ∈ R) holds) is-small-pres-forward b X = ⌜ is-small-pres b X ⌝ is-small-pres-backward : (b : B) → (X : 𝓟 {𝓥} B) → ((Ǝ j ꞉ I₁ , Y j ⊆ X × (b , Y j) ∈ R) holds) → b ≤ᴮ (⋁ 【 β , X 】) is-small-pres-backward b X = ⌜ is-small-pres b X ⌝⁻¹ ϕ-is-small : (a : ⟨ L ⟩) → (b : B) → ((b , a) ∈ ϕ) is 𝓥 small ϕ-is-small = pr₁ bnd small-ϕ : (b : B) → (a : ⟨ L ⟩) → 𝓥 ̇ small-ϕ b a = pr₁ (ϕ-is-small a b) small-ϕ-equiv-ϕ : (a : ⟨ L ⟩) → (b : B) → small-ϕ b a ≃ (b , a) ∈ ϕ small-ϕ-equiv-ϕ a b = pr₂ (ϕ-is-small a b) ϕ-is-small-forward : (a : ⟨ L ⟩) → (b : B) → small-ϕ b a → (b , a) ∈ ϕ ϕ-is-small-forward a b = ⌜ small-ϕ-equiv-ϕ a b ⌝ ϕ-is-small-backward : (a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → small-ϕ b a ϕ-is-small-backward a b = ⌜ small-ϕ-equiv-ϕ a b ⌝⁻¹ I₂ : 𝓥 ̇ I₂ = pr₁ (pr₂ bnd) α : I₂ → 𝓥 ̇ α = pr₁ (pr₂ (pr₂ bnd)) cover-condition : ((a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → (Ǝ i ꞉ I₂ , α i is-a-small-cover-of ↓ᴮ L β a) holds) cover-condition = pr₂ (pr₂ (pr₂ bnd)) \end{code} The following serves as evidence that the desired QIT family is small (and atleast has strictly positive point constructors). \begin{code} data Small-Ind-Check : B → 𝓥 ̇ where Small-c-cl' : (i : I₁) → ((b : B) → (b ∈ Y i → Small-Ind-Check b)) → (b : B) → (b , Y i) ∈ R → Small-Ind-Check b Small-ϕ-cl' : (i : I₂) → (m : α i → B) → (b : B) → small-ϕ b (⋁ (α i , β ∘ m)) → ((b' : B) → (b' ≤ᴮ (⋁ (α i , β ∘ m)) → Small-Ind-Check b')) → Small-Ind-Check b \end{code} Again, we use records to assert the existence of another QIT family with apropriate 'intiality' principle. As before we will first introduce some names for the closure properties. \begin{code} Small-c-closure : {𝓦 : Universe} (S : 𝓟 {𝓦} B) → 𝓥 ⊔ 𝓦 ̇ Small-c-closure S = (i : I₁) → ((b : B) → (b ∈ Y i → b ∈ S)) → (b : B) → (b , Y i) ∈ R → b ∈ S Small-ϕ-closure : {𝓦 : Universe} (S : 𝓟 {𝓦} B) → 𝓥 ⊔ 𝓦 ̇ Small-ϕ-closure S = (i : I₂) → (m : α i → B) → (b : B) → small-ϕ b (⋁ (α i , β ∘ m)) → ((b' : B) → (b' ≤ᴮ (⋁ (α i , β ∘ m)) → b' ∈ S)) → b ∈ S record inductively-generated-small-subset-exists : 𝓤ω where constructor inductively-generated-small-subset field Small-Ind : B → 𝓥 ̇ Small-Ind-trunc : (b : B) → is-prop (Small-Ind b) private Small-𝓘 : 𝓟 {𝓥} B Small-𝓘 b = (Small-Ind b , Small-Ind-trunc b) field Small-c-cl : Small-c-closure Small-𝓘 Small-ϕ-cl : Small-ϕ-closure Small-𝓘 Small-Ind-Initial : (P : 𝓟 {𝓦} B) → Small-c-closure P → Small-ϕ-closure P → Small-𝓘 ⊆ P module small-trunc-ind-def (ind-e : inductively-generated-small-subset-exists) where open inductively-generated-small-subset-exists ind-e Small-𝓘nd : 𝓟 {𝓥} B Small-𝓘nd b = (Small-Ind b , Small-Ind-trunc b) Small-𝓘nd-is-c-cl : Small-c-closure Small-𝓘nd Small-𝓘nd-is-c-cl = Small-c-cl Small-𝓘nd-is-ϕ-cl : Small-ϕ-closure Small-𝓘nd Small-𝓘nd-is-ϕ-cl = Small-ϕ-cl Small-𝓘nd-Initial : (P : 𝓟 {𝓦} B) → Small-c-closure P → Small-ϕ-closure P → Small-𝓘nd ⊆ P Small-𝓘nd-Initial = Small-Ind-Initial \end{code} We will now show that under the assumptions of small presentation and bounded ϕ that b ∈ Small-𝓘nd ≃ b ∈ 𝓘nd. We make essential use of the initiality of both types here. This will allow us to satisfy the smallness conditions needed to salvage the least fixed point theorem. \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open bounded-inductive-definitions L β h open small-presentation-of-lattice L β h open is-basis h module 𝓘nd-is-small-from-bounded-and-small-presentation (small-pres : has-small-presentation) (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) (bnd : is-bounded ϕ) where open small-QIT-from-bounded-and-small-presentation L β h small-pres ϕ bnd module 𝓘nd-is-small-QITs-exists (ind-e : inductively-generated-subset-exists L β h ϕ) (ind-e' : inductively-generated-small-subset-exists) where open trunc-ind-def L β h ϕ ind-e open small-trunc-ind-def ind-e' 𝓘nd-⊆-Small-𝓘nd : 𝓘nd ⊆ Small-𝓘nd 𝓘nd-⊆-Small-𝓘nd = 𝓘nd-is-initial Small-𝓘nd is-c-cl is-ϕ-cl where is-c-cl : (U : 𝓟 {𝓥} B) → U ⊆ Small-𝓘nd → (b : B) → b ≤ᴮ (⋁ 【 β , U 】) → b ∈ Small-𝓘nd is-c-cl U C b o = trunc-u (is-small-pres-forward b U o) where u : (Σ j ꞉ I₁ , Y j ⊆ U × (b , Y j) ∈ R) → b ∈ Small-𝓘nd u (j , C' , r) = Small-𝓘nd-is-c-cl j (λ x → λ y → C x (C' x y)) b r trunc-u : (Ǝ j ꞉ I₁ , Y j ⊆ U × (b , Y j) ∈ R) holds → b ∈ Small-𝓘nd trunc-u = ∥∥-rec (holds-is-prop (Small-𝓘nd b)) u is-ϕ-cl : (a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → ((b' : B) → b' ≤ᴮ a → b' ∈ Small-𝓘nd) → b ∈ Small-𝓘nd is-ϕ-cl a b p C = trunc-u (cover-condition a b p) where u : Σ i ꞉ I₂ , α i is-a-small-cover-of ↓ᴮ L β a → b ∈ Small-𝓘nd u (i , s) = Small-𝓘nd-is-ϕ-cl i (↓ᴮ-to-base L β a ∘ ⌞ s ⌟) b (ϕ-is-small-backward (⋁ (α i , ↓ᴮ-inclusion L β a ∘ ⌞ s ⌟)) b (transport (λ - → (b , -) ∈ ϕ) (a-=-⋁-α) p)) (λ b' → C b' ∘ (transport (λ - → b' ≤ᴮ -) (a-=-⋁-α ⁻¹))) where a-=-⋁-α : a = ⋁ (α i , ↓ᴮ-inclusion L β a ∘ ⌞ s ⌟) a-=-⋁-α = reindexing-along-surj-=-sup L s (↓ᴮ-inclusion L β a) a (⋁ (α i , ↓ᴮ-inclusion L β a ∘ ⌞ s ⌟)) (↓-is-sup a) (join-is-lub-of L (α i , ↓ᴮ-inclusion L β a ∘ ⌞ s ⌟)) trunc-u : (Ǝ i ꞉ I₂ , α i is-a-small-cover-of ↓ᴮ L β a) holds → b ∈ Small-𝓘nd trunc-u = ∥∥-rec (holds-is-prop (Small-𝓘nd b)) u Small-𝓘nd-⊆-𝓘nd : Small-𝓘nd ⊆ 𝓘nd Small-𝓘nd-⊆-𝓘nd = Small-𝓘nd-Initial 𝓘nd is-small-c-cl is-small-ϕ-cl where is-small-c-cl : (i : I₁) → Y i ⊆ 𝓘nd → (b : B) → (b , Y i) ∈ R → b ∈ 𝓘nd is-small-c-cl i C b r = 𝓘nd-is-c-closed (Y i) C b (is-small-pres-backward b (Y i) ∣ (i , (λ _ → id) , r) ∣) is-small-ϕ-cl : (i : I₂) → (m : α i → B) → (b : B) → small-ϕ b (⋁ (α i , β ∘ m)) → ((x : B) → x ≤ᴮ (⋁ (α i , β ∘ m)) → x ∈ 𝓘nd) → b ∈ 𝓘nd is-small-ϕ-cl i m b s C = 𝓘nd-is-ϕ-closed (⋁ (α i , β ∘ m)) b (ϕ-is-small-forward (⋁ (α i , β ∘ m)) b s) C 𝓘nd-is-small : (b : B) → (b ∈ 𝓘nd) is 𝓥 small 𝓘nd-is-small b = (b ∈ Small-𝓘nd , small-𝓘nd-equiv-𝓘nd) where small-𝓘nd-equiv-𝓘nd : b ∈ Small-𝓘nd ≃ b ∈ 𝓘nd small-𝓘nd-equiv-𝓘nd = logically-equivalent-props-are-equivalent (holds-is-prop (Small-𝓘nd b)) (holds-is-prop (𝓘nd b)) (Small-𝓘nd-⊆-𝓘nd b) (𝓘nd-⊆-Small-𝓘nd b) \end{code} As a corollary of the above result we get a predicative version of the least fixed point theorem. Notice that we are assuming our sup-lattice is small-presented and that we have a bounded ϕ that corresponds to our monotone map. This is the most general statement that can be made but we are actively exploring other, cleaner, formulations. In particular see the below notion of density which makes no mention of a particular inductive definition. Least fixed point theorem: Given a 𝓥-sup-lattice L with a 𝓥-presentation and a monotone endomap f : L → L. If there exists a bounded abstract inductive definition ϕ such that f = Γ ϕ, then f has a least fixed point. \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open local-inductive-definitions L β h open bounded-inductive-definitions L β h open small-presentation-of-lattice L β h open small-QIT-from-bounded-and-small-presentation L β h module QITs-exists-for-all-ϕ (ind-e : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → inductively-generated-subset-exists L β h ϕ) (ind'-e : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → (bnd : is-bounded ϕ) → (small-pres : has-small-presentation) → inductively-generated-small-subset-exists small-pres ϕ bnd) where \end{code} We first present the untruncated least fixed point theorem. \begin{code} Untruncated-Least-Fixed-Point-Theorem : (small-pres : has-small-presentation) → (f : ⟨ L ⟩ → ⟨ L ⟩) → (f-mono : is-monotone-endomap L f) → Σ ϕ ꞉ 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩) , Σ bnd ꞉ is-bounded ϕ , ((x : ⟨ L ⟩) → (Γ ϕ (bounded-implies-local ϕ bnd)) x = f x) → has-least-fixed-point L f Untruncated-Least-Fixed-Point-Theorem small-pres f f-mono (ϕ , bnd , H) = transport (λ g → Σ x ꞉ ⟨ L ⟩ , (g x = x) × ((a : ⟨ L ⟩) → (g a = a) → (x ≤ a) holds)) path Γ-has-least-fixed-point where open correspondance-from-locally-small-ϕ L β h ϕ (bounded-implies-local ϕ bnd) open small-𝓘nd-from-exists (ind-e ϕ) open 𝓘nd-is-small-from-bounded-and-small-presentation L β h small-pres ϕ bnd open small-QIT-from-bounded-and-small-presentation L β h small-pres ϕ bnd open 𝓘nd-is-small-QITs-exists (ind-e ϕ) (ind'-e ϕ bnd small-pres) open smallness-assumption 𝓘nd-is-small path : Γ ϕ (bounded-implies-local ϕ bnd) = f path = dfunext fe H \end{code} We can now state the (truncated) least fixed point theorem. \begin{code} Least-Fixed-Point-Theorem : (small-pres : has-small-presentation) → (f : ⟨ L ⟩ → ⟨ L ⟩) → (f-mono : is-monotone-endomap L f) → (Ǝ ϕ ꞉ 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩) , Σ bnd ꞉ is-bounded ϕ , ((x : ⟨ L ⟩) → (Γ ϕ (bounded-implies-local ϕ bnd)) x = f x)) holds → has-least-fixed-point L f Least-Fixed-Point-Theorem small-pres f f-mono = ∥∥-rec (has-least-fixed-point-is-prop L f) (Untruncated-Least-Fixed-Point-Theorem small-pres f f-mono) \end{code} We now explore conditions on monotone endomaps that guarantee they correspond to some bounded inductive definition. We tentatively call this notion 'density'. A monotone map f, on a 𝓥-generated sup-lattice L, is dense if there is a family γ : I → L, I : 𝓥, such that for all b : B and a : L we have b ≤ᴮ f a → (Ǝ v ꞉ I , b ≤ᴮ f (γ v) × v ≤ᴮ a) \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where private _≤_ = order-of L ⋁_ = join-of L open local-inductive-definitions L β h open bounded-inductive-definitions L β h open is-basis h density-condition : (f : ⟨ L ⟩ → ⟨ L ⟩) → (I : 𝓥 ̇) → (γ : I → ⟨ L ⟩) → 𝓤 ⊔ 𝓣 ⊔ 𝓥 ̇ density-condition f I γ = (b : B) → (a : ⟨ L ⟩) → b ≤ᴮ f a → (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × (γ i ≤ a) holds) holds is-dense : (f : ⟨ L ⟩ → ⟨ L ⟩) → 𝓤 ⊔ 𝓣 ⊔ (𝓥 ⁺) ̇ is-dense f = Σ I ꞉ 𝓥 ̇ , Σ γ ꞉ (I → ⟨ L ⟩) , density-condition f I γ module _ (l-small : ⟨ L ⟩ is-locally 𝓥 small) where private _=ˢ_ : ⟨ L ⟩ → ⟨ L ⟩ → 𝓥 ̇ x =ˢ y = resized (x = y) (l-small x y) =ˢ-equiv-= : {x y : ⟨ L ⟩} → (x =ˢ y) ≃ (x = y) =ˢ-equiv-= {x} {y} = resizing-condition (l-small x y) =ˢ-to-= : {x y : ⟨ L ⟩} → (x =ˢ y) → (x = y) =ˢ-to-= = ⌜ =ˢ-equiv-= ⌝ =-to-=ˢ : {x y : ⟨ L ⟩} → (x = y) → (x =ˢ y) =-to-=ˢ = ⌜ =ˢ-equiv-= ⌝⁻¹ =ˢ-refl : {x : ⟨ L ⟩} → x =ˢ x =ˢ-refl = =-to-=ˢ refl dense-implies-bounded : (f : ⟨ L ⟩ → ⟨ L ⟩) → is-monotone-endomap L f → is-dense f → Σ ϕ ꞉ 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩) , Σ bnd ꞉ is-bounded ϕ , ((a : ⟨ L ⟩) → (Γ ϕ (bounded-implies-local ϕ bnd)) a = f a) dense-implies-bounded f f-mono (I , γ , f-dense) = (ϕ , bnd , H) where ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩) ϕ (b , a') = (Lift 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds) , equiv-to-prop (Lift-≃ 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds)) (holds-is-prop (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a'))) bnd : is-bounded ϕ bnd = (ϕ-small , (I , (λ z → small-↓ᴮ (γ z)) , covering-cond)) where ϕ-small : (a : ⟨ L ⟩) → (b : B) → (ϕ (b , a) holds) is 𝓥 small ϕ-small a b = ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a) holds , ≃-Lift 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a) holds)) covering-cond : (a : ⟨ L ⟩) → (b : B) → (b , a) ∈ ϕ → (Ǝ i ꞉ I , small-↓ᴮ (γ i) ↠ ↓ᴮ L β a) holds covering-cond a b = demote-equiv-to-surj ∘ transport-lemma ∘ unlift-ϕ where unlift-ϕ : (b , a) ∈ ϕ → (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a) holds unlift-ϕ = ⌜ Lift-≃ 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a) holds) ⌝ transport-lemma : (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a) holds → (Ǝ i ꞉ I , small-↓ᴮ (γ i) ≃ ↓ᴮ L β a) holds transport-lemma = ∥∥-rec (holds-is-prop (Ǝ i ꞉ I , small-↓ᴮ (γ i) ≃ ↓ᴮ L β a)) (λ (i , o , eq) → ∣ (i , transport (λ z → small-↓ᴮ (γ i) ≃ ↓ᴮ L β z) (=ˢ-to-= eq) small-↓ᴮ-≃-↓ᴮ) ∣) demote-equiv-to-surj : (Ǝ i ꞉ I , small-↓ᴮ (γ i) ≃ ↓ᴮ L β a) holds → (Ǝ i ꞉ I , small-↓ᴮ (γ i) ↠ ↓ᴮ L β a) holds demote-equiv-to-surj = ∥∥-functor (λ (i , f , f-is-equiv) → (i , f , equivs-are-surjections f-is-equiv)) H : (a : ⟨ L ⟩) → Γ ϕ (bounded-implies-local ϕ bnd) a = f a H a = reindexing-along-equiv-=-sup L ↓ᴮ-fa-equiv-↓ (β ∘ (↓-to-base ϕ a)) (Γ ϕ (bounded-implies-local ϕ bnd) a) (f a) (sup-of-small-fam-is-lub L (β ∘ ↓-to-base ϕ a) (bounded-implies-local ϕ bnd a)) (is-supᴮ (f a)) where ↓ᴮ-fa-equiv-↓ : (small-↓ᴮ (f a)) ≃ (ϕ ↓ a) ↓ᴮ-fa-equiv-↓ = Σ-cong ↓ᴮ-fa-equiv where ↓ᴮ-fa-equiv : (b : B) → b ≤ᴮ f a ≃ (Ǝ a' ꞉ ⟨ L ⟩ , Lift 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds) × (a' ≤ a) holds) holds ↓ᴮ-fa-equiv b = logically-equivalent-props-are-equivalent ≤ᴮ-is-prop-valued (holds-is-prop (Ǝ a' ꞉ ⟨ L ⟩ , Lift 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds) × (a' ≤ a) holds)) (↓ᴮ-fa-to b) (to-↓ᴮ-fa b) where ↓ᴮ-fa-to : (b : B) → b ≤ᴮ f a → (Ǝ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds) holds ↓ᴮ-fa-to b = ∥∥-functor (g ∘ u) ∘ f-dense b a where u : Σ i ꞉ I , b ≤ᴮ f (γ i) × (γ i ≤ a) holds → Σ a' ꞉ ⟨ L ⟩ , (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds × (a' ≤ a) holds u (i , o , r) = (γ i , ∣ (i , o , =ˢ-refl) ∣ , r) g : Σ a' ꞉ ⟨ L ⟩ , (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds × (a' ≤ a) holds → Σ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds g (a' , e , r) = (a' , ⌜ ≃-Lift 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds) ⌝ e , r) to-↓ᴮ-fa : (b : B) → (Ǝ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds) holds → b ≤ᴮ f a to-↓ᴮ-fa b = ∥∥-rec ≤ᴮ-is-prop-valued u ∘ ∥∥-functor g where u' : (a' : ⟨ L ⟩) → Σ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a' → (a' ≤ a) holds → b ≤ᴮ f a u' a' (i , r , path) o = ≤-to-≤ᴮ (transitivity-of L (β b) (f a') (f a) (transport (λ z → (β b ≤ z) holds) (ap f (=ˢ-to-= path)) (≤ᴮ-to-≤ r)) (f-mono a' a o)) trunc-u' : (a' : ⟨ L ⟩) → (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds → (a' ≤ a) holds → b ≤ᴮ f a trunc-u' a' = ∥∥-rec (Π-is-prop fe (λ _ → ≤ᴮ-is-prop-valued)) (u' a') u : Σ a' ꞉ ⟨ L ⟩ , (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds × (a' ≤ a) holds → b ≤ᴮ f a u = uncurry (λ a' → uncurry (trunc-u' a')) g : Σ a' ꞉ ⟨ L ⟩ , (b , a') ∈ ϕ × (a' ≤ a) holds → Σ a' ꞉ ⟨ L ⟩ , (Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds × (a' ≤ a) holds g (a' , e , r) = (a' , ⌜ Lift-≃ 𝓤 ((Ǝ i ꞉ I , b ≤ᴮ f (γ i) × γ i =ˢ a') holds) ⌝ e , r) \end{code} We use the notion of density, along with the reasonable assumption that our lattice is locally small, to state another version of the least fixed point theorem. \begin{code} module _ {𝓤 𝓣 𝓥 : Universe} {B : 𝓥 ̇} (L : Sup-Lattice 𝓤 𝓣 𝓥) (β : B → ⟨ L ⟩) (h : is-basis L β) where open propositional-truncations-exist pt open bounded-inductive-definitions L β h open small-presentation-of-lattice L β h open small-QIT-from-bounded-and-small-presentation L β h module QITs-exists-density (ind-e : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → inductively-generated-subset-exists L β h ϕ) (ind'-e : (ϕ : 𝓟 {𝓤 ⊔ 𝓥} (B × ⟨ L ⟩)) → (bnd : is-bounded ϕ) → (small-pres : has-small-presentation) → inductively-generated-small-subset-exists small-pres ϕ bnd) where open QITs-exists-for-all-ϕ L β h ind-e ind'-e Least-Fixed-Point-Theorem-from-Density : has-small-presentation → ⟨ L ⟩ is-locally 𝓥 small → (f : ⟨ L ⟩ → ⟨ L ⟩) → is-monotone-endomap L f → is-dense L β h f → has-least-fixed-point L f Least-Fixed-Point-Theorem-from-Density small-pres l-small f f-mono f-dense = Untruncated-Least-Fixed-Point-Theorem small-pres f f-mono (dense-implies-bounded L β h l-small f f-mono f-dense) \end{code}