Skip to content
Snippets Groups Projects
Commit c4609250 authored by Eric Giovannini's avatar Eric Giovannini
Browse files

Move Delay-related files to Semantics

parent 7e36194e
No related branches found
No related tags found
No related merge requests found
...@@ -9,14 +9,14 @@ ...@@ -9,14 +9,14 @@
open import Common.Later open import Common.Later
open import Common.Common open import Common.Common
module Results.Delay where module Semantics.Delay where
open import Cubical.Foundations.Prelude open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function open import Cubical.Foundations.Function
open import Cubical.Data.Sum open import Cubical.Data.Sum
open import Cubical.Data.Unit renaming (Unit to ⊤) open import Cubical.Data.Unit renaming (Unit to ⊤)
open import Cubical.Data.Sigma open import Cubical.Data.Sigma
open import Cubical.Data.Nat renaming (ℕ to Nat) hiding (_·_ ; _^_) open import Cubical.Data.Nat -- renaming (ℕ to Nat) hiding (_·_ ; _^_)
open import Cubical.Foundations.Isomorphism open import Cubical.Foundations.Isomorphism
open import Cubical.Foundations.Structure open import Cubical.Foundations.Structure
open import Cubical.Data.Empty as ⊥ open import Cubical.Data.Empty as ⊥
...@@ -26,7 +26,7 @@ open import Cubical.Relation.Binary.Poset ...@@ -26,7 +26,7 @@ open import Cubical.Relation.Binary.Poset
import Cubical.Data.Equality as Eq import Cubical.Data.Equality as Eq
open import Semantics.Predomains open import Semantics.Predomains hiding (ℕ)
open import Semantics.StrongBisimulation open import Semantics.StrongBisimulation
open import Semantics.Lift open import Semantics.Lift
...@@ -44,93 +44,121 @@ private ...@@ -44,93 +44,121 @@ private
record Delay (Res : Type ℓ) : Type ℓ record Delay (Res : Type ℓ) : Type ℓ
data State (Res : Type ℓ) : Type ℓ where data State (Res : Type ℓ) : Type ℓ where
done : Res -> State Res -- should rename result to done done : Res -> State Res
running : Delay Res -> State Res running : Delay Res -> State Res
-- squash : isSet (State Res)
record Delay Res where record Delay Res where
coinductive coinductive
field view : State Res field view : State Res
open Delay public open Delay public
delayUnit : State X → Delay X fromState : State X → Delay X
view (delayUnit s) = s view (fromState s) = s
-- The delay that returns the given value of type X in one step. -- The delay that returns the given value of type X in one step.
doneD : X -> Delay X doneD : X -> Delay X
doneD x = delayUnit (done x) doneD x = fromState (done x)
-- Given a delay d, returns the delay d' that takes runs for one step -- Given a delay d, returns the delay d' that takes runs for one step
-- and then behaves as d. -- and then behaves as d.
stepD : Delay X -> Delay X stepD : Delay X -> Delay X
stepD d = delayUnit (running d) stepD d = fromState (running d)
_↓_#_ : Delay X -> X -> Nat -> Type
d ↓ x # n = {!!} -- An alternative definition of the Delay type using functions from natural numbers
-- to X ⊎ Unit
module Alternative (X : Type ℓ) where
-- Given a delay d, return a function on nats n that,
-- when d ≡ running ^ n (done x), maps n to x and every other number to undefined -- Given a delay d, return a function on nats that, when d ≡ running ^ n (done x),
toFun : Delay X -> (Nat -> (X ⊎ Unit)) -- maps n to x and every other number to undefined.
toFun d zero with view d fromDelay : Delay X → (ℕ → X ⊎ Unit)
... | done x = inl x fromDelay d n with d .view
... | running x = inr _
toFun d (suc n) with view d
... | done x = inr _
... | running d' = toFun d' n
-- Given a function f on nats, return a delay that runs for n0 steps and returns x,
-- where n0 is the smallest nat such that f n0 = inl x
fromFun : {X : Type ℓ} -> (Nat -> (X ⊎ Unit)) -> Delay X
fromFun {X = X} f .view with f 0
... | inl x = done x
... | inr _ = running (fromFun (f ∘ suc))
retrFun : (d : Delay X) -> fromFun (toFun d) ≡ d
retrFun d i .view with d .view in eq
... | done x = done x
... | running d' = running (goal _ eq i)
where
goal : ∀ s -> s Eq.≡ running d' -> fromFun (toFun (delayUnit s) ∘ suc) ≡ d'
goal .(running d') Eq.refl = retrFun d'
isSetDelay : isSet X -> isSet (Delay X)
isSetDelay H = isSetRetract toFun fromFun retrFun (isSetΠ λ _ -> isSet⊎ H isSetUnit)
isSetDelay' : ∀ {ℓ : Level} -> {X : Type ℓ} → isSet X → isSet (Delay X)
isSetDelay' {X = X} p = isSetRetract f g h (isSetΠ λ n → isSet⊎ p isSetUnit)
where
-- f : Delay X → (Nat → X ⊎ Unit)
-- f d zero with d .view
-- ... | done x = inl x
-- ... | running x = {!inr tt!}
-- f d (suc n) with d .view
-- ... | done x = inr tt
-- ... | running d' = f d' n
f : Delay X → (Nat → X ⊎ Unit)
f d n with d .view
-- f d n | done x = inl x -- f d n | done x = inl x
f d zero | done x = inl x fromDelay d zero | done x = inl x
f d (suc n) | done x = inr tt fromDelay d (suc n) | done x = inr tt
f d zero | running _ = inr tt fromDelay d zero | running _ = inr tt
f d (suc n) | running d' = f d' n fromDelay d (suc n) | running d' = fromDelay d' n
-- Given a function f on nats, return a delay that runs for n0 steps and returns x,
-- where n0 is the smallest nat such that f n0 = inl x.
toDelay : (ℕ → X ⊎ Unit) → Delay X
toDelay f .view with f zero
... | inl x = done x
... | inr tt = running (toDelay λ n → f (suc n))
retr : (d : Delay X) → toDelay (fromDelay d) ≡ d
retr d i .view with d .view
... | done x = done x
... | running d' = running (retr d' i)
PreDelay' : Type ℓ
PreDelay' = ℕ -> (X ⊎ Unit)
Delay' : Type ℓ
Delay' = Σ[ f ∈ PreDelay' ] fromDelay (toDelay f) ≡ f
terminatesWith : PreDelay' -> X -> Type ℓ
terminatesWith d x = Σ[ n ∈ ℕ ] d n ≡ inl x
terminates : PreDelay' -> Type ℓ
terminates d = Σ[ n ∈ ℕ ] Σ[ x ∈ X ] d n ≡ inl x
-- We can characterize the functions f for which fromDelay (toDelay f) ≡ f
-- These are the functions that are defined at most once, i.e.,
-- if f n ≡ inl x and f m ≡ inl x', then n ≡ m
-- Iso with global lift
f' : (∀ k -> L k X) -> PreDelay'
f' y n with y k0
f' y zero | η x = inl x
f' y (suc n) | η x = inr tt
f' y zero | θ l~ = inr tt
f' y (suc n) | θ l~ = f' y n
f : (∀ k -> L k X) -> Delay'
f y = (f' y) , {!!}
g'' : (k : Clock) -> (▹ k , (Delay' -> L k X)) -> Delay' -> L k X
g'' k rec h with fst h zero
... | inl x = η x
... | inr tt = θ (λ t → rec t ((λ n -> fst h (suc n)) , {!!}))
g' : ∀ k -> Delay' -> L k X
g' k = fix (g'' k)
g : Delay' -> (∀ k -> L k X)
g h k = g' k h
sec' : (h : Delay') -> (k : Clock) ->
(▹ k , (f (λ k' -> g'' k' (next (g' k')) h) ≡ h)) ->
(f (λ k' -> g'' k' (next (g' k')) h) ≡ h)
sec' h k IH with fst h zero in eq
... | inl x = Σ≡Prop {!!} aux
where
aux : f' (λ k' -> η x) ≡ h .fst
aux = funExt λ { zero → sym (Eq.eqToPath eq) ; (suc n) → {!!}}
... | inr x = Σ≡Prop {!!} {!!}
unfold-g' : {k : Clock} -> g' k ≡ g'' k (next (g' k))
unfold-g' {k} = fix-eq (g'' k)
sec : section f g
sec = {!!}
isSetDelay : ∀ {ℓ : Level} -> {X : Type ℓ} → isSet X → isSet (Delay X)
isSetDelay {X = X} p = isSetRetract fromDelay toDelay retr (isSetΠ λ n → isSet⊎ p isSetUnit)
where open Alternative X
g : (Nat → X ⊎ Unit) → Delay X
g f .view with f zero
... | inl x = done x
... | inr tt = running (g λ n → f (suc n))
h : (d : Delay X) → g (f d) ≡ d
h d i .view with d .view
... | done x = done x
... | running d' = running (h d' i)
...@@ -184,121 +212,6 @@ result-inj {x = x} eq = cong′ (pred' x) eq ...@@ -184,121 +212,6 @@ result-inj {x = x} eq = cong′ (pred' x) eq
{-
module Isomorphism {X : Type} where
-- to : L℧F X -> Delay (Result (□ X))
-- to l = to' (Iso.fun L℧F-iso l)
to' : (((□ X) ⊎ ⊤) ⊎ (L℧F X)) -> Delay (Result (□ X))
view (to' (inl (inl x))) = done (value x)
view (to' (inl (inr tt))) = done error
view (to' (inr l')) = running (to' (inr l'))
to : L℧F X -> Delay (Result (□ X))
to l = to' (Iso.fun L℧F-iso l)
fro' : (k : Clock) -> ▹ k ,
(Delay (Result (□ X)) -> L℧ k X) ->
(Delay (Result (□ X)) -> L℧ k X)
fro' k rec m with (view m)
... | done (value x) = η (x k)
... | done error = ℧
... | running m' = θ (λ t -> rec t m')
fro : Delay (Result (□ X)) -> L℧F X
fro d k = fix (fro' k) d
unfold-fro : (d : Delay (Result (□ X))) (k : Clock) ->
fro d k ≡ fro' k (next (λ d -> fro d k)) d
unfold-fro d k = let eq = fix-eq (fro' k) in
λ i -> eq i d
sec : section to fro
sec d = {!!}
retr' : (k : Clock) -> (l : L℧F X) -> ▹ k ,
(fro' k (next (λ d -> fro d k)) (to' (Iso.fun L℧F-iso l)) ≡ l k) ->
(fro' k (next (λ d -> fro d k)) (to' (Iso.fun L℧F-iso l)) ≡ l k)
retr' k l IH with (Iso.fun L℧F-iso l) in eq
... | inl (inl x) = let eq' = L℧F-iso-η-inv l x {!!} in {!!}
... | inl (inr tt) = let eq' = {!L℧F-iso-inv-℧!} in {!!}
... | inr l' = {!!}
retr : retract to fro
retr l with (Iso.fun L℧F-iso l) in eq
... | inl (inl x) = {!!}
... | inl (inr tt) =
{!!} ≡⟨ funExt (λ k -> unfold-fro (to' (inl (inr tt))) k) ⟩
{!!} ≡⟨ {!!} ⟩ {!!}
l ∎
... | inr l' = {!!}
module Isomorphism2 {X : Type} where
to' : (k : Clock) -> L℧ k X -> Delay (Result (□ X))
view (to' k (η x)) = done (value (λ k -> x))
view (to' k ℧) = done error
view (to' k (θ x)) = running (to' k (x ◇))
to : L℧F X -> Delay (Result (□ X))
to l = to' k0 (l k0)
-- TODO should X have type Clock -> Type?
-- Then the correct iso would be
-- L℧F X ≅ Delay (∀ k -> X k)
module Isom {X : Type} (H-irrel : clock-irrel X) where
X? = Result X
∀-to-delay : (L℧F X) -> Delay (Result X)
view (∀-to-delay l) with (Iso.fun (L℧F-iso-irrel H-irrel) l)
... | inl (inl x) = done (value x)
... | inl (inr tt) = done error
... | inr l' = running (∀-to-delay l')
delay-to-∀'' : (k : Clock) -> ▹ k , (Delay X? -> L℧ k X) -> (Delay X? -> L℧ k X)
delay-to-∀'' k rec m with (view m)
... | done (value x) = η x
... | done error = ℧
... | running m' = θ (λ t → rec t m')
delay-to-∀' : (k : Clock) -> (Delay X?) -> L℧ k X
delay-to-∀' k = fix (delay-to-∀'' k)
unfold-d2∀ : (k : Clock) -> delay-to-∀' k ≡ delay-to-∀'' k (next (delay-to-∀' k))
unfold-d2∀ k = fix-eq (delay-to-∀'' k)
delay-to-∀ : Delay X? -> L℧F X
delay-to-∀ m k = fix (delay-to-∀'' k) m
sec : section ∀-to-delay delay-to-∀
sec b = {!!}
retr : retract ∀-to-delay delay-to-∀
retr l with (Iso.fun (L℧F-iso-irrel H-irrel) l)
... | inl (inl x) = clock-ext (λ k → {!!})
... | inl (inr _) = {!!}
... | inr x = {!!}
-- Showing these are inverses requires a notion of equality for Delays,
-- which is the bisimilarity relation defined below.
-}
module IsSet (X : Type) (isSetX : isSet X) where module IsSet (X : Type) (isSetX : isSet X) where
X? : Type X? : Type
...@@ -376,138 +289,3 @@ module StrongBisim (X : Type) where -- (H-irrel : clock-irrel ⟨ X ⟩) where ...@@ -376,138 +289,3 @@ module StrongBisim (X : Type) where -- (H-irrel : clock-irrel ⟨ X ⟩) where
dec' {running x} {done x₁} (con ()) dec' {running x} {done x₁} (con ())
dec' {running x} {running x₁} (con x₂) = cong running (dec x₂) dec' {running x} {running x₁} (con x₂) = cong running (dec x₂)
{-
iso1 : ∀ {m m'} -> (p : m ≈ m') -> enc (dec p) ≡ p
iso1' : ∀ {s s'} -> (p : s ≈'' s') -> enc' (dec' p) ≡ p
-}
{-
iso2 : ∀ {m m'} -> (p : m ≡ m') -> dec (enc p) ≡ p
iso2' : ∀ {s s'} -> (p : s ≡ s') -> dec' (enc' p) ≡ p
view (iso2 p i j) = iso2' (cong view p) i j
iso2' {done x} {done y} p = λ i j → {!!}
iso2' {done x} {running d'} p = {!!}
iso2' {running d} {done y} p = {!!}
iso2' {running m} {running m'} p i j = {!!}
-}
{-
bisim : ∀ {m m'} -> m ≈ m' -> m ≡ m'
bisim' : ∀ {m m'} -> m ≈' m' -> m ≡ m'
-- bisim' {result x} {result y} (con (xRy , yRx)) = cong result (antisym X x y xRy yRx)
bisim' {done x} {done y} (con p) = cong done p
bisim' {running m} {running m'} (con m≈m') = cong running (bisim m≈m')
view (bisim m≈m' i) = bisim' (prove m≈m') i
misib : ∀ {m m'} → m ≡ m' → m ≈ m'
misib' : ∀ {m m'} → m ≡ m' → m ≈' m'
misib' {done x} {done y} eq = con (result-inj eq)
misib' {running m} {running m'} p = con (misib (cong pred'' p))
misib' {done x} {running m} = result≠running {X}
misib' {running m} {done x} eq = result≠running {X} (sym eq)
prove (misib m≡m') = misib' (cong view m≡m')
iso1 : ∀ {m m'} -> (p : m ≈ m') -> misib (bisim p) ≡ p
iso1' : ∀ {s s'} -> (p : s ≈' s') -> misib' (bisim' p) ≡ p
iso1' {done x} {done y} (con p) = refl
iso1' {running m} {running m'} (con p) = cong con (iso1 p)
prove (iso1 p i) = iso1' (prove p) i
iso2 : ∀ {m m'} -> (p : m ≡ m') -> bisim (misib p) ≡ p
iso2' : ∀ {s s'} -> (p : s ≡ s') -> bisim' (misib' p) ≡ p
iso2' {running m} {running m'} p = {!!}
iso2' _ = {!!}
iso2 = {!!}
module Evaluate {ℓ : Level} (X : Type ℓ) where
_↓_ : Delay X -> X -> Type ℓ
d ↓ x = X
module WeakBisim {ℓ ℓ' : Level}
(X : Type ℓ) (Y : Type ℓ') (R : X -> Y -> Type (ℓ-max ℓ ℓ')) where
module EvX = Evaluate X
module EvY = Evaluate Y
_↓X_ = EvX._↓_
_↓Y_ = EvY._↓_
-- Coinductive lock-step bisimilarity on delays
record _≈_ (d : Delay X) (d' : Delay Y) : Type (ℓ-suc (ℓ-max ℓ ℓ'))
-- Bisimilarity on states
{- _≈''_ : State X -> State Y -> Type -}
-- Inductive type of proofs of bisimilarity
data _≈'_ : (s : State X) (s' : State Y) -> Type (ℓ-suc (ℓ-max ℓ ℓ'))
where
-- con : s ≈'' s' -> s ≈' s'
done-done : ∀ x y -> R x y -> done x ≈' done y
done-run : ∀ x y d' -> d' ↓Y y -> R x y -> done x ≈' running d'
run-done : ∀ x y d -> d ↓X x -> R x y -> running d ≈' done y
run-run : ∀ d d' -> d ≈ d' -> running d ≈' running d'
record _≈_ m m' where
coinductive
field prove : view m ≈' view m'
-- Ret and Ext for Delays
ret-delay : {X : Type} -> X -> Delay X
ret-delay = doneD
ext-delay : {X Y : Type} -> (X -> Delay Y) -> Delay X -> Delay Y
ext-state : {X Y : Type} -> (X -> State Y) -> State X -> State Y
view (ext-delay f mx) = ext-state (view ∘ f) (view mx)
ext-state f (done x) = f x
ext-state f (running m) = running (ext-delay (delay ∘ f) m)
-}
{-
∀-to-delay : (L℧F X) -> (Delay (X ⊎ ⊤))
view (∀-to-delay l) with (l k0)
... | η x = inl (inl x) -- done (inl x) }
... | ℧ = inl (inr tt) -- done (inr tt) }
... | θ lx~ = inr (tt , (∀-to-delay l)) -- running }
{-# TERMINATING #-}
delay-to-∀ : Delay (X ⊎ ⊤) -> L℧F X
delay-to-∀ m with (view m)
... | inl (inl x) = λ k -> η x
... | inl (inr tt) = λ k -> ℧
... | inr (tt , m') = λ k -> θ λ t → delay-to-∀ m' k
isom : {X : Type} -> Iso (L℧F X) (Delay (X ⊎ ⊤))
isom {X} = iso ∀-to-delay delay-to-∀ sec retr
where
sec : section ∀-to-delay delay-to-∀
sec m with (view m)
... | inl (inl x) = {!!}
... | inl (inr tt) = {!!}
... | inr (_ , m') = {!!}
retr : retract ∀-to-delay delay-to-∀
retr l with (l k0) in eq
... | η x = clock-ext {!!}
... | ℧ = clock-ext {!!}
... | θ l~ = {!!}
-}
...@@ -2,7 +2,10 @@ ...@@ -2,7 +2,10 @@
{-# OPTIONS --guardedness #-} {-# OPTIONS --guardedness #-}
{-# OPTIONS -W noUnsupportedIndexedMatch #-} {-# OPTIONS -W noUnsupportedIndexedMatch #-}
module Results.DelayCoalgebra where -- to allow opening this module in other files while there are still holes
{-# OPTIONS --allow-unsolved-metas #-}
module Semantics.DelayCoalgebra where
open import Cubical.Foundations.Prelude open import Cubical.Foundations.Prelude
open import Cubical.Foundations.Function open import Cubical.Foundations.Function
...@@ -16,7 +19,7 @@ open import Cubical.Foundations.Isomorphism ...@@ -16,7 +19,7 @@ open import Cubical.Foundations.Isomorphism
import Cubical.Data.Equality as Eq import Cubical.Data.Equality as Eq
open import Results.Delay open import Semantics.Delay
private private
variable variable
...@@ -114,7 +117,7 @@ module _ (X : Type ℓ) (isSetX : isSet X) where ...@@ -114,7 +117,7 @@ module _ (X : Type ℓ) (isSetX : isSet X) where
DelayCoalgFinal : {ℓc : Level} -> (c : Coalg ℓ) -> DelayCoalgFinal : {ℓc : Level} -> (c : Coalg ℓ) ->
isContr (Σ[ h ∈ (c .V -> Delay X) ] unfold-delay ∘ h ≡ liftSum h ∘ c. un) -- isContr (CoalgMorphism c DelayCoalg) isContr (Σ[ h ∈ (c .V -> Delay X) ] unfold-delay ∘ h ≡ liftSum h ∘ c. un) -- isContr (CoalgMorphism c DelayCoalg)
DelayCoalgFinal c = DelayCoalgFinal c =
(fun , (funExt commute)) , {!!} (fun , (funExt commute)) , unique' (fun , (funExt commute))
where where
fun : c .V -> Delay X fun : c .V -> Delay X
...@@ -131,8 +134,8 @@ module _ (X : Type ℓ) (isSetX : isSet X) where ...@@ -131,8 +134,8 @@ module _ (X : Type ℓ) (isSetX : isSet X) where
unique' : (s s' : Σ[ h ∈ (c .V → Delay X) ] unique' : (s s' : Σ[ h ∈ (c .V → Delay X) ]
(unfold-delay ∘ (h) ≡ liftSum h ∘ (c .un))) -> (unfold-delay ∘ (h) ≡ liftSum h ∘ (c .un))) ->
s ≡ s' s ≡ s'
unique' (h , com) (h' , com') = {!!} unique' (h , com) (h' , com') =
-- Σ≡Prop (λ g -> isPropΠ (λ v -> {!!})) (funExt eq-fun) Σ≡Prop (λ g -> isSetΠ (λ v -> isSet⊎ isSetX (isSetDelay isSetX)) _ _) (funExt eq-fun)
where where
eq-fun : (v : c .V) -> h v ≡ h' v eq-fun : (v : c .V) -> h v ≡ h' v
view (eq-fun v i) with c .un v in eq view (eq-fun v i) with c .un v in eq
...@@ -168,47 +171,3 @@ module _ (X : Type ℓ) (isSetX : isSet X) where ...@@ -168,47 +171,3 @@ module _ (X : Type ℓ) (isSetX : isSet X) where
s1 ≡ s2 s1 ≡ s2
goal .(running (h v')) .(running (h' v')) Eq.refl Eq.refl = goal .(running (h v')) .(running (h' v')) Eq.refl Eq.refl =
cong running (eq-fun v') cong running (eq-fun v')
{-
unique : (s : Σ[ h' ∈ (c .V → Delay X) ] (unfold-delay ∘ h' ≡ liftSum h' ∘ c .un)) →
(fun , funExt commute) ≡ s
unique (h' , com') = Σ≡Prop (λ g -> isSetΠ (λ v -> isSet⊎ isSetX (isSetDelay isSetX)) _ _) (funExt aux)
where
-- aux : (v : c .V) → fun v ≡ h' v
-- aux v with c .un v
-- ... | inl x = λ i -> {!!}
-- ... | inr x = {!!}
aux : (v : c .V) → fun v ≡ h' v
view (aux v i) with c. un v in eq
... | inl x =
let com-v = funExtS⁻ com' v in
let eq' = lem1 (view (h' v)) x
(com-v ∙ λ j -> liftSum h' (Eq.eqToPath eq j)) in
sym eq' i
... | inr v' =
let com-v = funExtS⁻ com' v in
{-let eq' = lem2 (view (h' v)) (fun v')
(com-v ∙ (λ j -> liftSum h' (Eq.eqToPath eq j)) ∙ cong inr (sym (aux v'))) in
sym eq' i -}
view (goal _ eq {!!})
where
goal : ∀ w -> w Eq.≡ inr v' -> (fun v') ≡ (h' v')
goal w Eq.refl = λ j -> (aux v' j) -- view (aux v')
-}
-- NTS: liftSum h' (c .un v) ≡ inr (fun v')
-- Have : c .un v Eq.≡ inr v'
--
-- Substituting, NTS:
-- liftSum h' (inr v') ≡ inr (fun v')
-- i.e.
-- inr (h' v') ≡ inr (fun v')
-- i.e.
-- h' v' ≡ fun v'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment