g2-0.2.0.0: src/G2/Language/Primitives.hs
module G2.Language.Primitives ( mkGe
, mkGt
, mkEq
, mkNeq
, mkLt
, mkLe
, mkAnd
, mkOr
, mkNot
, mkPlus
, mkMinus
, mkMult
, mkDiv
, mkMod
, mkNegate
, mkImplies
, mkIff
, mkFromInteger
, mkToInteger
, mkEqPrimInt
, mkEqPrimFloat
, mkEqPrimDouble
, mkEqPrimChar
, mkAndPrim
, mkGePrimInt
, mkLePrimInt
, mkEqPrimType
, mkOrPrim
, mkImpliesPrim
, mkNotPrim
, mkStringAppend
, mkStringLen) where
import qualified G2.Language.ExprEnv as E
import G2.Language.KnownValues as KV
import G2.Language.Syntax
import qualified G2.Language.Typing as T
mkGe :: KnownValues -> E.ExprEnv -> Expr
mkGe kv eenv = eenv E.! (geFunc kv)
mkGt :: KnownValues -> E.ExprEnv -> Expr
mkGt kv eenv = eenv E.! (gtFunc kv)
mkEq :: KnownValues -> E.ExprEnv -> Expr
mkEq kv eenv = eenv E.! (eqFunc kv)
mkNeq :: KnownValues -> E.ExprEnv -> Expr
mkNeq kv eenv = eenv E.! (neqFunc kv)
mkLt :: KnownValues -> E.ExprEnv -> Expr
mkLt kv eenv = eenv E.! (ltFunc kv)
mkLe :: KnownValues -> E.ExprEnv -> Expr
mkLe kv eenv = eenv E.! (leFunc kv)
mkAnd :: KnownValues -> E.ExprEnv -> Expr
mkAnd kv eenv = eenv E.! (andFunc kv)
mkOr :: KnownValues -> E.ExprEnv -> Expr
mkOr kv eenv = eenv E.! (orFunc kv)
mkNot :: KnownValues -> E.ExprEnv -> Expr
mkNot kv eenv = eenv E.! (notFunc kv)
mkPlus :: KnownValues -> E.ExprEnv -> Expr
mkPlus kv eenv = eenv E.! (plusFunc kv)
mkMinus :: KnownValues -> E.ExprEnv -> Expr
mkMinus kv eenv = eenv E.! (minusFunc kv)
mkMult :: KnownValues -> E.ExprEnv -> Expr
mkMult kv eenv = eenv E.! (timesFunc kv)
mkDiv :: KnownValues -> E.ExprEnv -> Expr
mkDiv kv eenv = eenv E.! (divFunc kv)
mkMod :: KnownValues -> E.ExprEnv -> Expr
mkMod kv eenv = eenv E.! (modFunc kv)
mkNegate :: KnownValues -> E.ExprEnv -> Expr
mkNegate kv eenv = eenv E.! (negateFunc kv)
mkImplies :: KnownValues -> E.ExprEnv -> Expr
mkImplies kv eenv = eenv E.! (impliesFunc kv)
mkIff :: KnownValues -> E.ExprEnv -> Expr
mkIff kv eenv = eenv E.! (iffFunc kv)
mkFromInteger :: KnownValues -> E.ExprEnv -> Expr
mkFromInteger kv eenv = eenv E.! (fromIntegerFunc kv)
mkToInteger :: KnownValues -> E.ExprEnv -> Expr
mkToInteger kv eenv = eenv E.! (toIntegerFunc kv)
-- Primitives on primitive types
mkEqPrimType :: Type -> KnownValues -> Expr
mkEqPrimType t kv =
Prim Eq $ TyFun t (TyFun t (TyCon (KV.tyBool kv) TYPE))
mkEqPrimInt :: KnownValues -> Expr
mkEqPrimInt = mkEqPrimType TyLitInt
mkEqPrimFloat :: KnownValues -> Expr
mkEqPrimFloat = mkEqPrimType TyLitFloat
mkEqPrimDouble :: KnownValues -> Expr
mkEqPrimDouble = mkEqPrimType TyLitDouble
mkEqPrimChar :: KnownValues -> Expr
mkEqPrimChar = mkEqPrimType TyLitChar
mkGePrimInt :: KnownValues -> Expr
mkGePrimInt kv = Prim Ge $ TyFun t (TyFun t (TyCon (KV.tyBool kv) TYPE))
where
t = TyLitInt
mkLePrimInt :: KnownValues -> Expr
mkLePrimInt kv = Prim Le $ TyFun t (TyFun t (TyCon (KV.tyBool kv) TYPE))
where
t = TyLitInt
mkAndPrim :: KnownValues -> Expr
mkAndPrim kv = Prim And $ TyFun t (TyFun t (TyCon (KV.tyBool kv) TYPE))
where t = (TyCon (KV.tyBool kv) TYPE)
mkOrPrim :: KnownValues -> Expr
mkOrPrim kv = Prim Or $ TyFun t (TyFun t (TyCon (KV.tyBool kv) TYPE))
where t = (TyCon (KV.tyBool kv) TYPE)
mkNotPrim :: KnownValues -> Expr
mkNotPrim kv = Prim Not $ TyFun t (TyCon (KV.tyBool kv) TYPE)
where t = (TyCon (KV.tyBool kv) TYPE)
mkImpliesPrim :: KnownValues -> Expr
mkImpliesPrim kv = Prim Implies $ TyFun t (TyFun t t)
where t = (TyCon (KV.tyBool kv) TYPE)
mkStringAppend :: KnownValues -> Expr
mkStringAppend kv = Prim StrAppend $ TyFun t (TyFun t t)
where t = TyApp (T.tyList kv) (T.tyChar kv)
mkStringLen :: KnownValues -> Expr
mkStringLen kv = Prim StrLen $ TyFun t TyLitInt
where t = TyApp (T.tyList kv) (T.tyChar kv)