--Generate the Z3 code checking if the given statement matches the given post-condition
z3wlpSingle :: (Statement, Expression) -> (String, [String])
z3wlpSingle (s, q) =
  let
    varDecs vars = foldr (\v decs -> decs ++ "\n" ++ varDec v) "" vars
    (theWLP, conds)  = wlp (Map.empty, Map.empty, s) s q
    formatPred p = (varDecs (freeVars s) ++ "\n") ++ (formatZ3 $ p )
  in  (formatPred theWLP, map formatPred conds)
z3wlpSingle :: (Statement, Expression) -> (String, [String])
z3wlpSingle (s, q) =
  let
    varDecs vars = foldr (\v decs -> decs ++ "\n" ++ varDec v) "" vars
    (theWLP, conds)  = wlp (Map.empty, Map.empty, s) s q
    formatPred p = (varDecs (freeVars s) ++ "\n") ++ (formatZ3 $ p )
  in  (formatPred theWLP, map formatPred conds)
z3wlpSingle (s, q) =
  let
    varDecs vars = foldr (\v decs -> decs ++ "\n" ++ varDec v) "" vars
    (theWLP, conds)  = wlp (Map.empty, Map.empty, s) s q
    formatPred p = (varDecs (freeVars s) ++ "\n") ++ (formatZ3 $ p )
  in  (formatPred theWLP, map formatPred conds)