Newer
Older
module LogicIR.Backend.Z3 (lExprToZ3Ast) where
import Z3.Monad
import LogicIR.Expr
import LogicIR.Fold
lExprToZ3Ast :: LExpr -> Z3 AST
lExprToZ3Ast = foldLExpr lExprToZ3AstAlgebra
lExprToZ3AstAlgebra :: LExprAlgebra (Z3 AST)
lExprToZ3AstAlgebra = (flConst, flVar, flNot, flBinop, flComp, flQuant, flArray, flNil, fnConst, fnUnop, fnBinop, fnIf, fnLen) where
flConst b = mkBool b
flVar (Var t n) = do symbol <- mkStringSymbol n
case t of
TPrim PInt -> mkIntVar symbol
TPrim PBool -> mkBoolVar symbol
_ -> error $ show n
flNot a = a >>= mkNot
flBinop a' o b' = do a <- a'
b <- b'
case o of
LAnd -> mkAnd [a, b]
LOr -> mkOr [a, b]
LImpl -> mkImplies a b
LBicond -> undefined
flComp a' o b' = do a <- a'
b <- b'
case o of
CEqual -> mkEq a b
CNEqual -> mkEq a b >>= mkNot
CLess -> mkLt a b
CGreater -> mkGt a b
CLeq -> mkLe a b
CGeq -> mkGe a b
flQuant = undefined
flArray = undefined
flNil = undefined
fnConst n = mkInteger (fromIntegral n)
fnUnop = undefined
fnBinop a' o b' = do a <- a'
b <- b'
case o of
NAdd -> mkAdd [a, b]
_ -> undefined
fnIf = undefined
fnLen = undefined