module Data.SBV.Examples.Basics.UnsafeFunctionEquality where
import System.IO.Unsafe (unsafePerformIO)
import Data.SBV
instance Equality (a -> b) => Eq (a -> b) where
f == g = unsafePerformIO $ do
r <- f === g
case r of
ThmResult (Unsatisfiable _) -> return True
ThmResult (Satisfiable _ _) -> return False
_ -> error $ "Cannot decide function equality!"
type B = SWord8
f11 :: B -> B
f11 x = x
f12 :: B -> (B, B)
f12 x = (x, x)
f21 :: (B, B) -> B
f21 (x, y) = x + y
f22 :: (B, B) -> (B, B)
f22 (x, y) = (x, y)
f31 :: B -> B -> B
f31 x y = x + y
f32 :: B -> B -> (B, B)
f32 x y = (x, y)
f33 :: B -> B -> B -> (B, B, B)
f33 x y z = (x, y, z)
t :: [Bool]
t = [ f11 == f11
, f12 == f12
, f21 == f21
, f22 == f22
, f31 == f31
, f32 == f32
, f33 == f33
, f33 /= f33
]