123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- module Path where
- open import Basics hiding (_==_)
- open import Proc
- import Graph
- private open module G = Graph Nat
- data Node : Set where
- node : Nat -> Node
- stop : Node
- _==_ : Node -> Node -> Bool
- stop == stop = true
- node zero == node zero = true
- node (suc n) == node (suc m) = node n == node m
- _ == _ = false
- data U : Set where
- int : U
- ext : U
- data Name : Set where
- fwd-edge : Nat -> Nat -> Name
- bwd-edge : Nat -> Node -> Name
- start : Nat -> Name
- finish : Nat -> Name
- N : U -> Set
- N int = Name
- N ext = False
- data Msg : Set where
- forward : Node -> Node -> Msg
- backward : Node -> Msg
- T : U -> Set
- T int = Msg
- T ext = Node
- private
- module Impl where
- private module P = ProcDef U T N
- open P hiding (_!_)
- P = Proc int
- infixr 40 _!_
- _!_ : Msg -> P -> P
- m ! p = P._!_ (lift m) p
- fwd : Nat -> Nat -> Msg
- fwd from to = forward (node from) (node to)
- fwd-runner : Nat -> Nat -> P
- fwd-runner from to = > react
- where
- react : Msg -> P
- react (forward from' to') =
- if to' == node from
- then fwd from to ! def (bwd-edge from from')
- else def (fwd-edge from to)
- react (backward _) = o
- bwd-runner : Nat -> Node -> P
- bwd-runner from w = > react
- where
- react : Msg -> P
- react (backward n) =
- if n == w then o
- else if n == node from
- then backward w ! o
- else def (bwd-edge from w)
- react (forward _ _) = def (bwd-edge from w)
- pitcher : Nat -> P
- pitcher n = forward stop (node n) ! o
- batter : Nat -> P
- batter n = > react
- where
- react : Msg -> P
- react (forward from to) =
- if to == node n
- then backward from ! o
- else def (start n)
- react _ = def (start n)
- env : Env
- env int (fwd-edge from to) = fwd-runner from to
- env int (bwd-edge from w) = bwd-runner from w
- env int (start n) = batter n
- env int (finish n) = pitcher n
- env ext ()
- edges : Graph -> P
- edges [] = o
- edges (edge x y :: G) = def (fwd-edge x y) || edges G
- φ : Tran ext int
- φ = record { upV = up; downV = down }
- where
- down : Node -> Lift Msg
- down x = lift (backward x)
- up : Msg -> Lift Node
- up (forward _ _) = bot
- up (backward x) = lift x
- main : Graph -> Nat -> Nat -> Proc ext
- main G x y = φ /| def (finish y) || def (start x) || edges G
- open Impl public
- param : Param
- param = record
- { U = U
- ; T = T
- ; Name = N
- ; env = env
- }
|