module Fixme where {-@ bindST :: forall <p :: s -> Prop, q :: s -> a -> s -> Prop, r :: s -> b -> s -> Prop>. (xm:s<p> -> (a, s)<q xm>) -> (xbind:a -> xk:(exists[xxxa:a].exists[xxa:s<p>].s<q xxa xxxa>) -> (b, s)<r xk>) -> xr:s<p> -> exists[xa:a]. exists[xxx:s<q xr xa>]. (b, s)<r xxx> @-} bindST :: (s -> (a, s)) -> (a -> (s -> (b, s))) -> (s -> (b, s)) bindST m k s = let (a, s') = m s in (k a) s' {-@ returnST :: forall <p :: s -> a -> s -> Prop>. xa:a -> xs:s<p v xa> -> (a,s)<p xs> @-} returnST :: a -> s -> (a, s) returnST x s = (x, s)