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}