123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- 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
|