module ErrorDomains where π : Setβ π = Setβ π : π π = Set open import Relation.Binary.PropositionalEquality using (_β‘_) open import Data.Product record Preorder : π where field X : π _β_ : X β X β π refl : β (x : X) β x β x trans : β {x y z : X} β x β y β y β z β x β z infixr 20 _β¨_ infixr 20 _β_ record _β¨_ (X : Preorder) (Y : Preorder) : π where module X = Preorder X module Y = Preorder Y field f : X.X β Y.X mon : β {x y} β X._β_ x y β Y._β_ (f x) (f y) app : β {X Y} β (X β¨ Y) β Preorder.X X β Preorder.X Y app = _β¨_.f _$_ = app _β_ : Preorder β Preorder β Preorder X β Y = record { X = X β¨ Y ; _β_ = Ξ» f g β (x : X.X) β _β¨_.f f x βy _β¨_.f g x ; refl = Ξ» x xβ β _β¨_.mon x (X.refl xβ) ; trans = Ξ» p1 p2 x β Y.trans (p1 x) (p2 x) } where module X = Preorder X module Y = Preorder Y _βy_ = Y._β_ _β¨_β_ : (X : Preorder) β Preorder.X X β Preorder.X X β Set X β¨ x β x' = Preorder._β_ X x x' record _β¨_β£_ (X : Preorder) (x y : Preorder.X X) : Set where module X = Preorder X _β_ = X._β_ field to : x β y fro : y β x record _β_ (X : Preorder) (Y : Preorder) : Set where field to : X β¨ Y fro : Y β¨ X eqX : β x β X β¨ app fro (app to x) β£ x eqY : β y β Y β¨ app to (app fro y) β£ y record _β_ (X Y : Preorder) : Set where _βy_ = Preorder._β_ Y field emb : X β¨ Y prj : Y β¨ X projection : β y β Y β¨ app emb (app prj y) β y retraction : β x β X β¨ x β£ app prj (app emb x) product : Preorder β Preorder β Preorder product X Y = record { X = X.X Γ Y.X ; _β_ = Ξ» p1 p2 β (projβ p1 βx projβ p2) Γ (projβ p1 βy projβ p2) ; refl = Ξ» x β (X.refl (projβ x)) , (Y.refl (projβ x)) ; trans = Ξ» leq1 leq2 β (X.trans (projβ leq1) (projβ leq2)) , Y.trans (projβ leq1) (projβ leq2) } where module X = Preorder X _βx_ = X._β_ module Y = Preorder Y _βy_ = Y._β_ data TransClosure {X : π}(_R_ : X β X β π) : X β X β π where one : β {x y} β x R y β TransClosure _R_ x y more : β {x y z} β x R y β TransClosure _R_ y z β TransClosure _R_ x z transClosureAppend : β {X}{_R_ : X β _}{x y z} β TransClosure _R_ x y β TransClosure _R_ y z β TransClosure _R_ x z transClosureAppend (one x) pyz = more x pyz transClosureAppend (more x pxy) pyz = more x (transClosureAppend pxy pyz) record ReflGraph : π where field X : π _β_ : X β X β π refl : β x β x β x _^+ : ReflGraph β Preorder G ^+ = record { X = G.X ; _β_ = TransClosure G._β_ ; refl = Ξ» x β one (G.refl x) ; trans = transClosureAppend } where module G = ReflGraph G -- Let's get some clocks going postulate K : π βΈ^ : K β π β π βΈ^' : K β π β π next^ : β {A}{k} β A β βΈ^ k A gfix^ : β {k : K}{X : π} β (βΈ^ k X β X) β X gfix^-unfold : β {k}{X} (f : βΈ^ k X β X) β gfix^ f β‘ f (next^ (gfix^ f)) next^' : β {A}{k} β A β βΈ^' k A gfix^' : β {k : K}{X : π} β (βΈ^' k X β X) β X gfix^'-unfold : β {k}{X} (f : βΈ^' k X β X) β gfix^' f β‘ f (next^' (gfix^' f))