packages feed

safe-coupling-0.1.0.0: src/Monad/PrM/Relational/TCB/Spec.hs

-----------------------------------------------------------------
-- | Relational Specifications for PrM Primitives -------------
-----------------------------------------------------------------

{-@ LIQUID "--reflection" @-}

module Monad.PrM.Relational.TCB.Spec where 

import Monad.PrM 
import Monad.PrM.Predicates

{-@ assume pureSpec :: p:(a -> b -> Bool) 
                    -> x1:a -> x2:b -> {_:_|p x1 x2} 
                    -> {lift p (ppure x1) (ppure x2)} @-}
pureSpec :: (a -> b -> Bool) -> a -> b -> () -> ()
pureSpec _ _ _ _ = ()

{-@ assume bindSpec :: p:(b -> b -> Bool) -> q:(a -> a -> Bool) 
                    -> e1:PrM a -> f1:(a -> PrM b) 
                    -> e2:PrM a -> f2:(a -> PrM b) 
                    -> {_:()|lift q e1 e2} 
                    -> (x1:a -> {x2:a|q x1 x2} -> {lift p (f1 x1) (f2 x2)})
                    -> {lift p (bind e1 f1) (bind e2 f2)} @-}
bindSpec :: (b -> b -> Bool) -> (a -> a -> Bool) -> 
              PrM a -> (a -> PrM b) -> PrM a -> (a -> PrM b) -> 
              () ->
              (a -> a -> ()) -> 
              ()
bindSpec _ _ _ _ _ _ _ _ = ()

{-@ assume bernoulliSpec :: p:Prob -> {q:Prob| leDoubleP p q}
                         ->  {lift leDoubleP (bernoulli p) (bernoulli q)} @-}
bernoulliSpec :: Prob -> Prob -> ()
bernoulliSpec _ _ = ()

{-@ assume liftSpec :: e:PrM a -> {lift eqP e e} @-}
liftSpec :: PrM a -> ()
liftSpec _ = ()


{-@ assume liftTrue :: e1:PrM a -> e2:PrM a -> {lift trueP e1 e2} @-}
liftTrue :: PrM a -> PrM a -> ()
liftTrue _ _ = ()