{-# LANGUAGE OverloadedStrings #-}

module Language.Fixpoint.Solver.Common (askSMT, toSMT) where

import Language.Fixpoint.Types.Config (Config)
import Language.Fixpoint.Smt.Interface (Context(..), checkValidWithContext)
import Language.Fixpoint.Types
import Language.Fixpoint.Types.Visitor (kvarsExpr)
import Language.Fixpoint.Defunctionalize (defuncAny)
import Language.Fixpoint.SortCheck (elaborate)

mytracepp :: (PPrint a) => String -> a -> a
mytracepp :: forall a. PPrint a => [Char] -> a -> a
mytracepp = [Char] -> a -> a
forall a. PPrint a => [Char] -> a -> a
notracepp

askSMT :: Config -> Context -> [(Symbol, Sort)] -> Expr -> IO Bool
askSMT :: Config -> Context -> [(Symbol, Sort)] -> Pred -> IO Bool
askSMT Config
cfg Context
ctx [(Symbol, Sort)]
xs Pred
e
--   | isContraPred e  = return False
  | Pred -> Bool
isTautoPred  Pred
e     = Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
  | [KVar] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Pred -> [KVar]
kvarsExpr Pred
e) = Context -> [(Symbol, Sort)] -> Pred -> Pred -> IO Bool
checkValidWithContext Context
ctx [] Pred
PTrue Pred
e'
  | Bool
otherwise          = Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
  where
    e' :: Pred
e' = [Char] -> Config -> Context -> [(Symbol, Sort)] -> Pred -> Pred
toSMT [Char]
"askSMT" Config
cfg Context
ctx [(Symbol, Sort)]
xs Pred
e

toSMT :: String -> Config -> Context -> [(Symbol, Sort)] -> Expr -> Pred
toSMT :: [Char] -> Config -> Context -> [(Symbol, Sort)] -> Pred -> Pred
toSMT [Char]
msg Config
cfg Context
ctx [(Symbol, Sort)]
xs Pred
e =
    Config -> SymEnv -> Pred -> Pred
forall a. Defunc a => Config -> SymEnv -> a -> a
defuncAny Config
cfg SymEnv
symenv (Pred -> Pred) -> (Pred -> Pred) -> Pred -> Pred
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
        Located [Char] -> SymEnv -> Pred -> Pred
forall a. Elaborate a => Located [Char] -> SymEnv -> a -> a
elaborate ([Char] -> Located [Char]
forall a. a -> Located a
dummyLoc [Char]
msg) ([(Symbol, Sort)] -> SymEnv
elabEnv [(Symbol, Sort)]
xs) (Pred -> Pred) -> (Pred -> Pred) -> Pred -> Pred
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
            [Char] -> Pred -> Pred
forall a. PPrint a => [Char] -> a -> a
mytracepp ([Char]
"toSMT from " [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
msg [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Pred -> [Char]
forall a. PPrint a => a -> [Char]
showpp Pred
e) (Pred -> Pred) -> Pred -> Pred
forall a b. (a -> b) -> a -> b
$
                Pred
e
  where
    elabEnv :: [(Symbol, Sort)] -> SymEnv
elabEnv = SymEnv -> [(Symbol, Sort)] -> SymEnv
insertsSymEnv SymEnv
symenv
    symenv :: SymEnv
symenv  = Context -> SymEnv
ctxSymEnv Context
ctx