Skip to content
Snippets Groups Projects
API.hs 1.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • module LogicIR.Backend.QuickCheck.API (equivalentTo) where
    
    
    Orestis Melkonian's avatar
    Orestis Melkonian committed
    import Control.Arrow ((***))
    
    import Data.Map (Map)
    import qualified Data.Map.Lazy as M
    
    import Data.Maybe (fromJust, fromMaybe, isNothing)
    import qualified LogicIR.Backend.QuickCheck.ModelGenerator as QC
    import LogicIR.Backend.QuickCheck.Test
    import LogicIR.Expr
    import LogicIR.Pretty (prettyLExpr)
    import Model
    
    
    -- | Determine the equality of two method's pre/post conditions.
    
    equivalentTo :: LExpr -> LExpr -> IO Response
    
    equivalentTo lexpr lexpr' = do
    
        (eq, testModel) <- testEquality 1000 lexpr lexpr'
    
        then return Equivalent
    
    Orestis Melkonian's avatar
    Orestis Melkonian committed
        else return $ NotEquivalent $ toZ3Model testModel
    
    Orestis Melkonian's avatar
    Orestis Melkonian committed
    toZ3Model :: (QC.Model, QC.ArrayModel) -> Model
    toZ3Model (m, arrayM) =
        M.fromList $
          map (prettyLExpr *** toModelVal) m ++
          map ((prettyLExpr *** toModelVals) . (LVar *** fmap LConst)) (M.toList arrayM)
    
    
    toModelVal :: LExpr -> ModelVal
    toModelVal (LConst (CBool b)) = BoolVal b
    toModelVal (LConst (CInt  i)) = IntVal  $ toInteger i
    toModelVal (LConst (CReal r)) = RealVal r
    
    toModelVals :: [LExpr] -> ModelVal
    
    Orestis Melkonian's avatar
    Orestis Melkonian committed
    toModelVals = ManyVal . map toModelVal