From 7e36194ee2adc11426d0024a174cee0c6f331c70 Mon Sep 17 00:00:00 2001 From: Max New <maxsnew@gmail.com> Date: Mon, 5 Jun 2023 18:25:12 -0400 Subject: [PATCH] A relational view on our monad (incomplete) --- .../Semantics/Concrete/ClockedRel.agda | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 formalizations/guarded-cubical/Semantics/Concrete/ClockedRel.agda diff --git a/formalizations/guarded-cubical/Semantics/Concrete/ClockedRel.agda b/formalizations/guarded-cubical/Semantics/Concrete/ClockedRel.agda new file mode 100644 index 0000000..bdcf2fb --- /dev/null +++ b/formalizations/guarded-cubical/Semantics/Concrete/ClockedRel.agda @@ -0,0 +1,113 @@ +module Semantics.Concrete.ClockedRel where + +open import Cubical.Foundations.Prelude +open import Cubical.Foundations.Univalence +open import Cubical.Foundations.Isomorphism +open import Cubical.Foundations.HLevels +open import Cubical.Foundations.Structure +open import Cubical.Relation.Nullary +open import Cubical.Foundations.HLevels +open import Cubical.Data.Nat +open import Cubical.Data.Sigma +open import Cubical.HITs.PropositionalTruncation as Trunc + +open import Cubical.Reflection.RecordEquiv +open import Cubical.Categories.Category hiding (isIso) + +-- This is a concrete implementation of "step indexed big step semantics" + +-- Clocked relations between X and Y that are propositional, +-- computable and functional should be isomorphic to Kleisli arrows of +-- the Delay monad + +private + variable + â„“ â„“' : Level + +ClockedRel : (X Y : Type â„“) → ∀ (â„“' : Level) → Type _ +ClockedRel X Y â„“' = (x : X) → (y : Y) → (n : â„•) → Type â„“' + +module _ {X Y : Type â„“} (R : ClockedRel X Y â„“') where + isPropositional : Type _ + isPropositional = ∀ x y n → isProp (R x y n) + + isPropIsPropositional : isProp isPropositional + isPropIsPropositional = isPropÎ 3 (λ x y z → isPropIsProp) + + isComputable : Type _ + isComputable = ∀ x n → Dec (∃[ y ∈ Y ] R x y n) + + isFunctional : Type _ + isFunctional = ∀ x y n y' n' → R x y n → R x y' n' → (y ≡ y') × (n ≡ n') + +record CompClockedRel {X Y Z : Type â„“} + (R : ClockedRel X Y â„“') (Q : ClockedRel Y Z â„“') + (x : X) (z : Z) (n : â„•) + : Type (â„“-max â„“ â„“') + where + field + nr : â„• + nq : â„• + y : Y + splits-n : nr + nq ≡ n + r-holds : R x y nr + q-holds : Q y z nq +open CompClockedRel +unquoteDecl CompClockedRelIsoΣ = declareRecordIsoΣ CompClockedRelIsoΣ (quote CompClockedRel) + +module _ (â„“ : Level) where + private + variable + X Y Z : Type â„“ + + open Category + open Iso + + idCR : ClockedRel X X â„“ + idCR x x' n = (x ≡ x') × Lift {j = â„“} (n ≡ 0) + + lemCompRelL : ∀ x y n → (R : ClockedRel X Y â„“) + → CompClockedRel idCR R x y n + → R x y n + lemCompRelL x y' n R p = transport path (p .q-holds) where + path' : p .nq ≡ n + path' = transport (λ i → p .r-holds .snd .lower i + p .nq ≡ n) (p .splits-n) + + path : R (p .y) y' (p .nq) ≡ R x y' n + path i = R (p .r-holds .fst (~ i)) y' (path' i) + -- have: p.r-holds .snd: p .nr ≡ 0 + -- have: p.splits-n : p.nr + p.nq ≡ n + -- want: p.nq ≡ n + + CLOCKED-REL : Category (â„“-suc â„“) (â„“-suc â„“) + CLOCKED-REL .ob = hSet â„“ + CLOCKED-REL .Hom[_,_] X Y = + Σ[ R ∈ ClockedRel ⟨ X ⟩ ⟨ Y ⟩ â„“ ] isPropositional R + CLOCKED-REL .id {X} = + idCR + , λ x y n → isPropΣ (X .snd _ _) (λ _ → isOfHLevelLift 1 (isSetâ„• _ _)) + CLOCKED-REL ._⋆_ Q R = + (λ x y n → ∥ CompClockedRel (Q .fst) (R .fst) x y n ∥â‚) + , λ x y n → isPropPropTrunc + CLOCKED-REL .⋆IdL (R , isPropR) = + Σ≡Prop (λ _ → isPropIsPropositional _) + (funExt λ x → funExt λ y → funExt λ n → + hPropExt isPropPropTrunc (isPropR _ _ _) + (Trunc.elim (λ _ → isPropR _ _ _) (λ z → + lemCompRelL x y n R z)) + λ r → ∣ (record + { nr = 0 + ; nq = n + ; y = x + ; splits-n = refl + ; r-holds = refl , lift refl + ; q-holds = r + }) ∣â‚) + CLOCKED-REL .⋆IdR = {!!} + CLOCKED-REL .⋆Assoc = {!!} + CLOCKED-REL .isSetHom {x = X}{y = Y} = + isSetRetract {B = (x : ⟨ X ⟩) → (y : ⟨ Y ⟩) → (n : â„•) → hProp â„“} + (λ (R , isPropR) x y n → (R x y n , isPropR x y n)) + (λ R → (λ x y n → ⟨ R x y n ⟩) , λ x y n → snd (R x y n)) + (λ _ → refl) + (isSetÎ 3 (λ x y n → isSetHProp)) -- GitLab