Agda-2.3.2.2: examples/outdated-and-incorrect/cbs/Proc.agda
module Proc where
open import Basics
module ProcDef (U : Set)(T : U -> Set)(Name : U -> Set) where
LT : U -> Set
LT a = Lift (T a)
record Tran (a b : U) : Set where
field
upV : T b -> LT a
downV : T a -> LT b
mapLT : {a b : U} -> (T a -> LT b) -> List (T a) -> List (T b)
mapLT f [] = []
mapLT f (x :: xs) with f x
... | bot = mapLT f xs
... | lift y = y :: mapLT f xs
infixr 40 _!_ _!_+_
infix 40 >_
infixr 30 _||_ _/|_
data Proc (a : U) : Set where
o : Proc a
>_ : (T a -> Proc a) -> Proc a
_!_ : LT a -> Proc a -> Proc a
_!_+_ : LT a -> Proc a -> (T a -> Proc a) -> Proc a
_||_ : Proc a -> Proc a -> Proc a
_/|_ : {b : U} -> Tran a b -> Proc b -> Proc a
def : Name a -> Proc a
Env : Set
Env = (a : U) -> Name a -> Proc a
record Param : Set1 where
field
U : Set
T : U -> Set
Name : U -> Set
env : ProcDef.Env U T Name
module Process (param : Param) where
private open module Par = Param param public
private open module Pro = ProcDef U T Name public
infixr 40 _!g_ _!_+g_
infix 40 >g_
infixr 30 _||g_ _/|g_
data Guard {a : U} : Proc a -> Set where
og : Guard o
>g_ : (f : T a -> Proc a) -> Guard (> f)
_!g_ : (w : LT a)(p : Proc a) -> Guard (w ! p)
_!_+g_ : (w : LT a)(p : Proc a)(f : T a -> Proc a) -> Guard (w ! p + f)
_||g_ : {p1 p2 : Proc a} -> Guard p1 -> Guard p2 -> Guard (p1 || p2)
_/|g_ : {b : U}(φ : Tran a b){p : Proc b} -> Guard p -> Guard (φ /| p)
defg : (x : Name a) -> Guard (env a x) -> Guard (def x)
infix 20 _-[_]->_ _-!_!->_
open Tran
data _-[_]->_ {a : U} : Proc a -> LT a -> Proc a -> Set where
qtau : {p : Proc a} -> p -[ bot ]-> p
rx-o : {v : T a} -> o -[ lift v ]-> o
rx-! : {v : T a}{w : LT a}{p : Proc a} -> w ! p -[ lift v ]-> w ! p
rx-> : {v : T a}{f : T a -> Proc a} -> > f -[ lift v ]-> f v
rx-+ : {v : T a}{w : LT a}{p : Proc a}{f : T a -> Proc a} ->
w ! p + f -[ lift v ]-> f v
rx-|| : {v : T a}{p1 p2 p1' p2' : Proc a} ->
p1 -[ lift v ]-> p1' ->
p2 -[ lift v ]-> p2' ->
p1 || p2 -[ lift v ]-> p1' || p2'
rx-/| : {v : T a}{b : U}{φ : Tran a b}{q q' : Proc b} ->
q -[ downV φ v ]-> q' ->
φ /| q -[ lift v ]-> φ /| q'
rx-def : {v : T a}{p : Proc a}{x : Name a} ->
env a x -[ lift v ]-> p ->
def x -[ lift v ]-> p
data _-!_!->_ {a : U} : Proc a -> LT a -> Proc a -> Set where
tx-! : {w : LT a}{p : Proc a} -> w ! p -! w !-> p
tx-+ : {w : LT a}{p : Proc a}{f : T a -> Proc a} ->
w ! p + f -! w !-> p
tx-!| : {w : LT a}{p p' q q' : Proc a} ->
p -! w !-> p' -> q -[ w ]-> q' ->
p || q -! w !-> p' || q'
tx-|! : {w : LT a}{p p' q q' : Proc a} ->
p -[ w ]-> p' -> q -! w !-> q' ->
p || q -! w !-> p' || q'
tx-/| : {b : U}{w : LT b}{φ : Tran a b}{q q' : Proc b} ->
q -! w !-> q' ->
φ /| q -! upV φ =<< w !-> φ /| q'
tx-def : {w : LT a}{p : Proc a}{x : Name a} ->
env a x -! w !-> p ->
def x -! w !-> p
data Silent {a : U} : Proc a -> Set where
silent-o : Silent o
silent-> : {f : T a -> Proc a} -> Silent (> f)
silent-|| : {p1 p2 : Proc a} ->
Silent p1 -> Silent p2 -> Silent (p1 || p2)
silent-def : {x : Name a} ->
Silent (env _ x) -> Silent (def x)
silent-/| : {b : U}{φ : Tran a b}{p : Proc b} ->
Silent p -> Silent (φ /| p)
infixr 40 _>!>_ _>*>_
data _-[_]->*_ {a : U} : Proc a -> List (T a) -> Proc a -> Set where
rnop : {p : Proc a} -> p -[ [] ]->* p
_>?>_ : {p q r : Proc a}{x : T a}{xs : List (T a)} ->
p -[ lift x ]-> q ->
q -[ xs ]->* r ->
p -[ x :: xs ]->* r
rx-||* : forall {a xs}{p1 p2 q1 q2 : Proc a} ->
p1 -[ xs ]->* p2 ->
q1 -[ xs ]->* q2 ->
p1 || q1 -[ xs ]->* p2 || q2
rx-||* rnop rnop = rnop
rx-||* (s1 >?> t1) (s2 >?> t2) = rx-|| s1 s2 >?> rx-||* t1 t2
rx-/|* : forall {a b xs}{φ : Tran a b}{p q : Proc b} ->
p -[ mapLT (downV φ) xs ]->* q ->
φ /| p -[ xs ]->* φ /| q
rx-/|* {xs = []} rnop = rnop
rx-/|* {xs = x :: xs}{φ = φ} t with it (downV φ x) refl
rx-/|* {xs = x :: xs}{φ}{p}{q} t | it bot eq =
rx-/| (lem₁ eq) >?> rx-/|* (lem₂ eq t)
where
lem₁ : forall {w} -> w == bot -> p -[ w ]-> p
lem₁ refl = qtau
lem₂ : downV φ x == bot ->
p -[ mapLT (downV φ) (x :: xs) ]->* q ->
p -[ mapLT (downV φ) xs ]->* q
lem₂ eq h with downV φ x
lem₂ refl h | .bot = h
rx-/|* {a}{b}{x :: xs}{φ}{p}{q} t | it (lift y) eq =
rx-/| (lem₁ eq t) >?> rx-/|* (lem₂ eq t)
where
Eqn = downV φ x == lift y
Asm = p -[ mapLT (downV φ) (x :: xs) ]->* q
r : Eqn -> Asm -> Proc b
r eq t with downV φ x
r refl (_>?>_ {q = q} _ _) | ._ = q
lem₁ : (eq : Eqn)(h : Asm) -> p -[ downV φ x ]-> r eq h
lem₁ eq t with downV φ x
lem₁ refl (s >?> _) | ._ = s
lem₂ : (eq : Eqn)(h : Asm) -> r eq h -[ mapLT (downV φ) xs ]->* q
lem₂ eq t with downV φ x
lem₂ refl (_ >?> t) | ._ = t
data _-!_!->*_ {a : U} : Proc a -> List (T a) -> Proc a -> Set where
tnop : {p : Proc a} -> p -! [] !->* p
_>!>_ : {p q r : Proc a}{x : T a}{xs : List (T a)} ->
p -! lift x !-> q ->
q -! xs !->* r ->
p -! x :: xs !->* r
_>*>_ : {p q r : Proc a}{xs : List (T a)} ->
p -! bot !-> q ->
q -! xs !->* r ->
p -! xs !->* r