packages feed

safe-coupling-0.1.0.0: src/Monad/PrM/Predicates.hs

-----------------------------------------------------------------
-- | Reflected Predicates (required for lifting) ----------------
-----------------------------------------------------------------

{-@ LIQUID "--reflection" @-}
{-@ LIQUID "--ple-local"  @-}

module Monad.PrM.Predicates where 

import Data.Dist 
import Data.List 

{-@ reflect trueP @-}
trueP :: a -> a -> Bool 
trueP _ _ = True 

{-@ reflect bounded @-}
{-@ bounded :: Double -> x:List Double -> ListEq Double {x} -> Bool @-}
bounded :: Double -> List Double -> List Double -> Bool
bounded m v1 v2 = distList distDouble v1 v2 <= m && llen v1 == llen v2

{-@ reflect boundedD @-}
boundedD :: Dist a -> Double -> a -> a -> Bool
boundedD d m v1 v2 = dist d v1 v2 <= m

{-@ reflect bounded' @-}
bounded' :: Double -> Double -> Double -> Bool
bounded' m x1 x2 = distD x1 x2 <= m

{-@ reflect eqP @-}
eqP :: Eq a => a -> a -> Bool
eqP = (==)


{-@ reflect leDoubleP @-}
{-@ leDoubleP :: x:Double -> y:Double -> {v:Bool|v <=> (x <= y)} @-}
leDoubleP :: Double -> Double -> Bool
leDoubleP x y = x <= y

{-@ reflect impP @-}
{-@ impP :: x:Bool -> y:Bool -> {v:Bool|v <=> (x => y)} @-}
impP :: Bool -> Bool -> Bool
impP True False = False
impP _    _     = True

{-@ reflect leIntP @-}
{-@ leIntP :: x:Int -> y:Int -> {v:Bool|v <=> (x <= y)} @-}
leIntP :: Int -> Int -> Bool
leIntP x y = x <= y

-- Properties on Predicates 
{-@ ple boundedNil @-}
{-@ boundedNil :: {m:_|0 <= m} -> {bounded m Nil Nil} @-}
boundedNil :: Double -> ()
boundedNil _ = ()