Tom de Jong, May 2019. Refactored Dec 2021. Least fixed points of Scott continuous maps. The flag --lossy-unification significantly speeds up the typechecking. (https://agda.readthedocs.io/en/latest/language/lossy-unification.html) \begin{code} {-# OPTIONS --safe --without-K --lossy-unification #-} open import MLTT.Spartan open import UF.FunExt open import UF.PropTrunc module DomainTheory.Basics.LeastFixedPoint (pt : propositional-truncations-exist) (fe : Fun-Ext) (๐ฅ : Universe) where open PropositionalTruncation pt open import UF.UniverseEmbedding open import Naturals.Order open import Notation.Order open import DomainTheory.Basics.Dcpo pt fe ๐ฅ open import DomainTheory.Basics.Exponential pt fe ๐ฅ open import DomainTheory.Basics.Miscelanea pt fe ๐ฅ open import DomainTheory.Basics.Pointed pt fe ๐ฅ module _ (๐ : DCPOโฅ {๐ค} {๐ฃ}) where iter : (n : โ) โ โช ๐ โนแตแถแตแตโฅ ๐ โซ โ โช ๐ โซ iter zero f = โฅ ๐ iter (succ n) f = [ ๐ โป , ๐ โป ]โจ f โฉ (iter n f) iter-is-monotone : (n : โ) โ is-monotone ((๐ โนแตแถแตแตโฅ ๐) โป) (๐ โป) (iter n) iter-is-monotone zero f g l = โฅ-is-least ๐ (iter zero g) iter-is-monotone (succ n) f g l = iter (succ n) f โโช ๐ โซ[ โฆ 1โฆ ] [ ๐ โป , ๐ โป ]โจ g โฉ (iter n f) โโช ๐ โซ[ โฆ 2โฆ ] iter (succ n) g โโช ๐ โซ where โฆ 1โฆ = l (iter n f) โฆ 2โฆ = monotone-if-continuous (๐ โป) (๐ โป) g (iter n f) (iter n g) (iter-is-monotone n f g l) n-family : {I : ๐ฅ ฬ } (ฮฑ : I โ โช ๐ โนแตแถแตแตโฅ ๐ โซ) (n : โ) โ I โ โช ๐ โซ n-family ฮฑ n i = iter n (ฮฑ i) n-family-is-directed : {I : ๐ฅ ฬ } (ฮฑ : I โ โช ๐ โนแตแถแตแตโฅ ๐ โซ) (ฮด : is-Directed ((๐ โนแตแถแตแตโฅ ๐) โป) ฮฑ) (n : โ) โ is-Directed (๐ โป) (n-family ฮฑ n) n-family-is-directed {I} ฮฑ ฮด n = inhabited-if-Directed ((๐ โนแตแถแตแตโฅ ๐ ) โป) ฮฑ ฮด , ฮต where ฮต : is-Semidirected (๐ โป) (n-family ฮฑ n) ฮต i j = โฅโฅ-functor h (semidirected-if-Directed ((๐ โนแตแถแตแตโฅ ๐) โป) ฮฑ ฮด i j) where h : (ฮฃ k ๊ I , (ฮฑ i) โโช ๐ โนแตแถแตแตโฅ ๐ โซ (ฮฑ k) ร (ฮฑ j) โโช ๐ โนแตแถแตแตโฅ ๐ โซ (ฮฑ k)) โ ฮฃ k ๊ I , (n-family ฮฑ n i) โโช ๐ โซ (n-family ฮฑ n k) ร (n-family ฮฑ n j) โโช ๐ โซ (n-family ฮฑ n k) h (k , l , m) = k , (iter-is-monotone n (ฮฑ i) (ฮฑ k) l) , (iter-is-monotone n (ฮฑ j) (ฮฑ k) m) double-โ-lemma : {I : ๐ฅ ฬ } (ฮฑ : I โ โช ๐ โนแตแถแตแตโฅ ๐ โซ) (ฮด : is-Directed ((๐ โนแตแถแตแตโฅ ๐) โป) ฮฑ) (n : โ) โ โ (๐ โป) (pointwise-family-is-directed (๐ โป) (๐ โป) ฮฑ ฮด (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n))) ๏ผ โ (๐ โป) (n-family-is-directed ฮฑ ฮด (succ n)) double-โ-lemma {I} ฮฑ ฮด n = antisymmetry (๐ โป) x y a b where ฮต : is-Directed (๐ โป) (pointwise-family (๐ โป) (๐ โป) ฮฑ (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n))) ฮต = (pointwise-family-is-directed (๐ โป) (๐ โป) ฮฑ ฮด (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n))) ฯ : (n : โ) โ is-Directed (๐ โป) (n-family ฮฑ n) ฯ n = n-family-is-directed ฮฑ ฮด n x : โช ๐ โซ x = โ (๐ โป) ฮต y : โช ๐ โซ y = โ (๐ โป) (n-family-is-directed ฮฑ ฮด (succ n)) a : x โโช ๐ โซ y a = โ-is-lowerbound-of-upperbounds (๐ โป) ฮต y g where g : (i : I) โ (pointwise-family (๐ โป) (๐ โป) ฮฑ (โ (๐ โป) (ฯ n)) i) โโช ๐ โซ y g i = sup-is-lowerbound-of-upperbounds (underlying-order (๐ โป)) s y u where ฮฒ : I โ โช ๐ โซ ฮฒ = [ ๐ โป , ๐ โป ]โจ ฮฑ i โฉ โ (n-family ฮฑ n) s : is-sup (underlying-order (๐ โป)) (pointwise-family (๐ โป) (๐ โป) ฮฑ (โ (๐ โป) (ฯ n)) i) ฮฒ s = continuity-of-function (๐ โป) (๐ โป) (ฮฑ i) I (n-family ฮฑ n) (ฯ n) u : (j : I) โ ฮฒ j โโจ ๐ โป โฉ y u j = โฅโฅ-rec (prop-valuedness (๐ โป) (ฮฒ j) y) v (semidirected-if-Directed ((๐ โนแตแถแตแตโฅ ๐) โป) ฮฑ ฮด i j) where v : (ฮฃ k ๊ I , ฮฑ i โโช ๐ โนแตแถแตแตโฅ ๐ โซ ฮฑ k ร ฮฑ j โโช ๐ โนแตแถแตแตโฅ ๐ โซ ฮฑ k) โ ฮฒ j โโช ๐ โซ y v (k , l , m) = ฮฒ j โโช ๐ โซ[ โฆ 1โฆ ] [ ๐ โป , ๐ โป ]โจ ฮฑ k โฉ (iter n (ฮฑ j)) โโช ๐ โซ[ โฆ 2โฆ ] iter (succ n) (ฮฑ k) โโช ๐ โซ[ โฆ 3โฆ ] y โโช ๐ โซ where โฆ 1โฆ = l (iter n (ฮฑ j)) โฆ 2โฆ = monotone-if-continuous (๐ โป) (๐ โป) (ฮฑ k) (iter n (ฮฑ j)) (iter n (ฮฑ k)) (iter-is-monotone n (ฮฑ j) (ฮฑ k) m) โฆ 3โฆ = โ-is-upperbound (๐ โป) (ฯ (succ n)) k b : y โโช ๐ โซ x b = โ-is-lowerbound-of-upperbounds (๐ โป) (ฯ (succ n)) x h where h : (i : I) โ (n-family ฮฑ (succ n) i) โโช ๐ โซ x h i = n-family ฮฑ (succ n) i โโช ๐ โซ[ โฆ 1โฆ ] [ ๐ โป , ๐ โป ]โจ ฮฑ i โฉ (โ (๐ โป) (ฯ n)) โโช ๐ โซ[ โฆ 2โฆ ] x โโช ๐ โซ where โฆ 1โฆ = monotone-if-continuous (๐ โป) (๐ โป) (ฮฑ i) (iter n (ฮฑ i)) (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n)) (โ-is-upperbound (๐ โป) (ฯ n) i) โฆ 2โฆ = โ-is-upperbound (๐ โป) ฮต i iter-is-continuous : (n : โ) โ is-continuous ((๐ โนแตแถแตแตโฅ ๐) โป) (๐ โป) (iter n) iter-is-continuous zero I ฮฑ ฮด = a , b where a : (i : I) โ iter zero (ฮฑ i) โโช ๐ โซ iter zero (โ ((๐ โนแตแถแตแตโฅ ๐) โป) {I} {ฮฑ} ฮด) a i = โฅ-is-least ๐ (iter zero (โ ((๐ โนแตแถแตแตโฅ ๐) โป) {I} {ฮฑ} ฮด)) b : (u : โช ๐ โซ) โ ((i : I) โ iter zero (ฮฑ i) โโช ๐ โซ u) โ iter zero (โ ((๐ โนแตแถแตแตโฅ ๐) โป) {I} {ฮฑ} ฮด) โโช ๐ โซ u b u l = โฅ-is-least ๐ u iter-is-continuous (succ n) I ฮฑ ฮด = ฮณ where ฮณ : is-sup (underlying-order (๐ โป)) (iter (succ n) (โ ((๐ โนแตแถแตแตโฅ ๐) โป) ฮด)) (iter (succ n) โ ฮฑ) ฮณ = transport (ฮป - โ is-sup (underlying-order (๐ โป)) - (iter (succ n) โ ฮฑ)) (h โปยน) k where k : is-sup (underlying-order (๐ โป)) (โ (๐ โป) (n-family-is-directed ฮฑ ฮด (succ n))) (iter (succ n) โ ฮฑ) k = โ-is-sup (๐ โป) (n-family-is-directed ฮฑ ฮด (succ n)) h = iter (succ n) s ๏ผโจ refl โฉ [ ๐ โป , ๐ โป ]โจ s โฉ (iter n s) ๏ผโจ โฆ 1โฆ โฉ [ ๐ โป , ๐ โป ]โจ s โฉ (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n)) ๏ผโจ refl โฉ โ (๐ โป) (pointwise-family-is-directed (๐ โป) (๐ โป) ฮฑ ฮด (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n))) ๏ผโจ โฆ 2โฆ โฉ โ (๐ โป) (n-family-is-directed ฮฑ ฮด (succ n)) โ where s = (โ ((๐ โนแตแถแตแตโฅ ๐) โป) {I} {ฮฑ} ฮด) โฆ 2โฆ = double-โ-lemma ฮฑ ฮด n โฆ 1โฆ = ap ([ ๐ โป , ๐ โป ]โจ s โฉ) e where e : iter n s ๏ผ โ (๐ โป) (n-family-is-directed ฮฑ ฮด n) e = antisymmetry (๐ โป) (iter n s) (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n)) l m where IH : is-sup (underlying-order (๐ โป)) (iter n (โ ((๐ โนแตแถแตแตโฅ ๐) โป) ฮด)) (iter n โ ฮฑ) IH = iter-is-continuous n I ฮฑ ฮด l : iter n s โโช ๐ โซ โ (๐ โป) (n-family-is-directed ฮฑ ฮด n) l = sup-is-lowerbound-of-upperbounds (underlying-order (๐ โป)) IH (โ (๐ โป) (n-family-is-directed ฮฑ ฮด n)) (โ-is-upperbound (๐ โป) (n-family-is-directed ฮฑ ฮด n)) m : โ (๐ โป) (n-family-is-directed ฮฑ ฮด n) โโช ๐ โซ iter n s m = โ-is-lowerbound-of-upperbounds (๐ โป) (n-family-is-directed ฮฑ ฮด n) (iter n s) (sup-is-upperbound (underlying-order (๐ โป)) IH) iter-c : โ โ DCPO[ (๐ โนแตแถแตแตโฅ ๐) โป , ๐ โป ] iter-c n = iter n , iter-is-continuous n iter-is-ฯ-chain : (n : โ) โ (iter-c n) โโจ ((๐ โนแตแถแตแตโฅ ๐) โป) โนแตแถแตแต (๐ โป) โฉ (iter-c (succ n)) iter-is-ฯ-chain zero f = โฅ-is-least ๐ (iter (succ zero) f) iter-is-ฯ-chain (succ n) f = monotone-if-continuous (๐ โป) (๐ โป) f (iter n f) (iter (succ n) f) (iter-is-ฯ-chain n f) iter-increases : (n m : โ) โ (n โค m) โ (iter-c n) โโจ ((๐ โนแตแถแตแตโฅ ๐) โป) โนแตแถแตแต (๐ โป) โฉ (iter-c m) iter-increases = ฯ-chains-increase (underlying-order ๐) (reflexivity ๐) (transitivity ๐) iter-c iter-is-ฯ-chain where ๐ = ((๐ โนแตแถแตแตโฅ ๐) โป) โนแตแถแตแต (๐ โป) iter-is-directed : is-Directed (((๐ โนแตแถแตแตโฅ ๐) โป) โนแตแถแตแต (๐ โป)) iter-c iter-is-directed = ฯ-chains-are-Directed (((๐ โนแตแถแตแตโฅ ๐) โป) โนแตแถแตแต (๐ โป)) iter-c iter-is-ฯ-chain \end{code} Since we are working with ๐ฅ-dcpos, we work with a copy of the type of natural numbers in ๐ฅ. \begin{code} private โ' : ๐ฅ ฬ โ' = Lift ๐ฅ โ iter-c' : โ' โ DCPO[ (๐ โนแตแถแตแตโฅ ๐) โป , ๐ โป ] iter-c' = iter-c โ lower iter-is-directed' : is-Directed (((๐ โนแตแถแตแตโฅ ๐) โป) โนแตแถแตแต (๐ โป)) iter-c' iter-is-directed' = reindexed-family-is-directed (((๐ โนแตแถแตแตโฅ ๐) โป) โนแตแถแตแต (๐ โป)) (โ-Lift ๐ฅ โ) iter-c iter-is-directed ฮผ : DCPO[ ((๐ โนแตแถแตแตโฅ ๐) โป) , (๐ โป) ] ฮผ = continuous-functions-sup ((๐ โนแตแถแตแตโฅ ๐) โป) (๐ โป) iter-c' iter-is-directed' ฮผ-gives-a-fixed-point : (f : DCPO[ (๐ โป) , (๐ โป) ]) โ [ (๐ โนแตแถแตแตโฅ ๐) โป , ๐ โป ]โจ ฮผ โฉ f ๏ผ [ ๐ โป , ๐ โป ]โจ f โฉ ([ (๐ โนแตแถแตแตโฅ ๐) โป , ๐ โป ]โจ ฮผ โฉ f) ฮผ-gives-a-fixed-point fc = antisymmetry (๐ โป) (ฮฝ fc) (f (ฮฝ fc)) l m where ฮฝ : DCPO[ (๐ โป) , (๐ โป) ] โ โช ๐ โซ ฮฝ = [ (๐ โนแตแถแตแตโฅ ๐) โป , ๐ โป ]โจ ฮผ โฉ f : โช ๐ โซ โ โช ๐ โซ f = [ ๐ โป , ๐ โป ]โจ fc โฉ ฮด : is-directed (underlying-order (๐ โป)) (pointwise-family ((๐ โนแตแถแตแตโฅ ๐) โป) (๐ โป) (iter-c') fc) ฮด = pointwise-family-is-directed ((๐ โนแตแถแตแตโฅ ๐) โป) (๐ โป) (iter-c') iter-is-directed' fc l : ฮฝ fc โโช ๐ โซ f (ฮฝ fc) l = โ-is-lowerbound-of-upperbounds (๐ โป) ฮด (f (ฮฝ fc)) h where h : (n : โ') โ iter (lower n) fc โโช ๐ โซ f (ฮฝ fc) h (zero , โ) = โฅ-is-least ๐ (f (ฮฝ fc)) h (succ n , โ) = monotone-if-continuous (๐ โป) (๐ โป) fc (iter n fc) (ฮฝ fc) (โ-is-upperbound (๐ โป) ฮด (n , โ)) m : f (ฮฝ fc) โโช ๐ โซ ฮฝ fc m = sup-is-lowerbound-of-upperbounds (underlying-order (๐ โป)) (continuity-of-function (๐ โป) (๐ โป) fc โ' ฮฑ ฮด) (ฮฝ fc) k where ฮฑ : โ' โ โช ๐ โซ ฮฑ = pointwise-family ((๐ โนแตแถแตแตโฅ ๐) โป) (๐ โป) iter-c' fc k : (n : โ') โ [ ๐ โป , ๐ โป ]โจ fc โฉ (ฮฑ n) โโช ๐ โซ ฮฝ fc k (n , โ) = f (ฮฑ (n , โ)) โโช ๐ โซ[ reflexivity (๐ โป) (f (ฮฑ (n , โ))) ] ฮฑ (succ n , โ) โโช ๐ โซ[ โ-is-upperbound (๐ โป) ฮด (succ n , โ) ] ฮฝ fc โโช ๐ โซ ฮผ-gives-lowerbound-of-fixed-points : (f : DCPO[ (๐ โป) , (๐ โป) ]) (d : โช ๐ โซ) โ [ ๐ โป , ๐ โป ]โจ f โฉ d โโช ๐ โซ d โ [ (๐ โนแตแถแตแตโฅ ๐) โป , ๐ โป ]โจ ฮผ โฉ f โโช ๐ โซ d ฮผ-gives-lowerbound-of-fixed-points f d l = โ-is-lowerbound-of-upperbounds (๐ โป) (pointwise-family-is-directed ((๐ โนแตแถแตแตโฅ ๐) โป) (๐ โป) iter-c' iter-is-directed' f) d g where g : (n : โ') โ iter (lower n) f โโช ๐ โซ d g (zero , โ) = โฅ-is-least ๐ d g (succ n , โ) = iter (succ n) f โโช ๐ โซ[ k ] [ ๐ โป , ๐ โป ]โจ f โฉ d โโช ๐ โซ[ l ] d โโช ๐ โซ where k = monotone-if-continuous (๐ โป) (๐ โป) f (iter n f) d (g (n , โ)) \end{code}