module MemoryState where
import Monad(liftM)
import Memories
import MemMonads
import State
instance MemMonad (StateM Memory) Addr Word where
rd a = liftM (\m -> lookupM m a) load
wr a w = update (updateM a w)
mallocM n = st (malloc n)
freeM r = st (\m->((),free r m))
{-P:
property RelatedResult range =
{| r1,r2 | {fst r1}==={fst r2} /\ EqRange range {snd r1} {snd r2} |}
property MostlyStateIndependent range =
{| m | All mem1 . All mem2 .
EqRange range mem1 mem2 ==>
RelatedResult range {runS m mem1} {runS m mem2} |}
assert ReturnS_MSI = {-#cert:ReturnS_MSI#-}
All range . All x . MostlyStateIndependent range {return x}
assert BindS_MSI = {-#cert:BindS_MSI#-}
All m1 . All xm2 . All range .
MostlyStateIndependent range m1 ==>
(All x . MostlyStateIndependent range {xm2 x}) ==>
MostlyStateIndependent range {m1 >>= xm2}
-}