module VerifiedNum where -- Hiding numeric operations, because they get by default translated to SMT equivalent import Prelude hiding (Num(..)) import qualified Prelude as Prelude class VerifiedNum a where (+) :: a -> a -> a (-) :: a -> a -> a {-@ predicate BoundInt X = 0 < X + 10000 && X < 10000 @-} {-@ type OkInt N = {v:Int | BoundInt N => v == N} @-} {-@ type ValidInt = {v:Int | BoundInt v} @-} instance VerifiedNum Int where {-@ instance VerifiedNum Int where + :: x:Int -> y:Int -> OkInt {x + y} @-} x + y = (Prelude.+) x y {-@ instance VerifiedNum Int where - :: x:Int -> y:Int -> OkInt {x - y} @-} x - y = (Prelude.-) x y {-@ good :: {v:Int | v == 10} @-} good :: Int good = 5 + 5