Skip to content
Snippets Groups Projects
Z3.hs 1.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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
    
        fnConst n = mkInteger (fromIntegral n)
    
        fnBinop a' o b' = do a <- a'
                             b <- b'
                             case o of
                                NAdd -> mkAdd [a, b]
                                _ -> undefined
    
        fnIf = undefined
        fnLen = undefined