From 3d18fc67b7e388660847453b81096cff783737ef Mon Sep 17 00:00:00 2001
From: Orestis Melkonian <melkon.or@gmail.com>
Date: Mon, 15 Jan 2018 18:36:52 +0100
Subject: [PATCH] LIR: Real arithmetic

---
 .../javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java    | 12 ++++++++++++
 javawlp.cabal                                        |  2 --
 src/LogicIR/Backend/Pretty.hs                        |  3 ++-
 src/LogicIR/Backend/Z3.hs                            |  2 ++
 src/LogicIR/Expr.hs                                  |  2 ++
 src/LogicIR/Fold.hs                                  |  1 +
 src/LogicIR/Frontend/Java.hs                         |  1 +
 src/LogicIR/Parser.hs                                |  4 +++-
 stack.yaml                                           |  3 ---
 9 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/examples/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java b/examples/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java
index cec6feb..061e892 100644
--- a/examples/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java
+++ b/examples/javawlp_edsl/src/nl/uu/javawlp_edsl/Main.java
@@ -29,6 +29,18 @@ public class Main {
         pre(~(a * 2) == (79 & 40)); // can't evaluate due to undefined variable
     }
 
+    public static float float1(float a) {
+        pre(a >= 2);
+        a += a;
+        post(a >= 4);
+    }
+
+    public static float float2(float a) {
+        pre(a > 2 || a == 2);
+        a = a * 2;
+        post(a > 4 || a == 4);
+    }
+
     public static int mymin(int[] a, int b) {
         assert forall(a, i -> {
             return a[i] > b;
diff --git a/javawlp.cabal b/javawlp.cabal
index c6f00f2..14b91a8 100644
--- a/javawlp.cabal
+++ b/javawlp.cabal
@@ -26,7 +26,6 @@ library
                      , LogicIR.Backend.Z3
                      , LogicIR.Backend.Test
                      , LogicIR.Backend.ModelGenerator
-                     , LogicIR.Backend.SBV
                      , LogicIR.Backend.Pretty
                      , LogicIR.Backend.Null
                      , LogicIR.Fold
@@ -50,7 +49,6 @@ library
                      , pretty
                      , mtl
                      , containers
-                     , sbv
   default-language:    Haskell2010
 
 test-suite javawlp-tests
diff --git a/src/LogicIR/Backend/Pretty.hs b/src/LogicIR/Backend/Pretty.hs
index a311066..4af16c1 100644
--- a/src/LogicIR/Backend/Pretty.hs
+++ b/src/LogicIR/Backend/Pretty.hs
@@ -13,6 +13,7 @@ prettyLExpr = foldLExpr prettyLExprAlgebra
 prettyType :: Type -> String
 prettyType (TPrim PInt32) = "int"
 prettyType (TPrim PBool)  = "bool"
+prettyType (TPrim PFloat)  = "float"
 prettyType (TArray t)     = prettyType t ++ "[]"
 
 prettyLBinop :: LBinop -> String
@@ -43,7 +44,7 @@ prettyNUnop op =
     LNot -> "!"
 
 prettyVar :: Var -> String
-prettyVar (Var t n) = prettyType t ++ ":" ++ n
+prettyVar (Var t n) = n ++ ":" ++ prettyType t
 
 prettyLExprAlgebra :: LExprAlgebra String
 prettyLExprAlgebra = (fConst, prettyVar, fUnop, fBinop, fIf, fQuant, fArray, fIsnull, fLen) where
diff --git a/src/LogicIR/Backend/Z3.hs b/src/LogicIR/Backend/Z3.hs
index e45d099..6b1977f 100644
--- a/src/LogicIR/Backend/Z3.hs
+++ b/src/LogicIR/Backend/Z3.hs
@@ -16,12 +16,14 @@ lExprToZ3AstAlgebra = (fConst, fVar, fUnop, fBinop, fIf, fQuant, fArray, fIsnull
     fConst c = case c of
       CBool b -> mkBool b
       CInt n -> mkBitvector 32 (fromIntegral n)
+      CFloat f -> mkRealNum f
       CNil -> error "null constants cannot be used directly with Z3 (use LogicIR.Backend.Null)"
     fVar (Var t n) = do
       symbol <- mkStringSymbol n
       case t of
         "int" -> mkBvVar symbol 32
         "bool" -> mkBoolVar symbol
+        "float" -> mkRealVar symbol
         "[int]" -> do
           intSort <- mkBvSort 32
           arraySort <- mkArraySort intSort intSort
diff --git a/src/LogicIR/Expr.hs b/src/LogicIR/Expr.hs
index 7049765..e9160a5 100644
--- a/src/LogicIR/Expr.hs
+++ b/src/LogicIR/Expr.hs
@@ -5,6 +5,7 @@ import Data.String
 -- | The primitive types are bool and int32.
 data Primitive = PBool
                | PInt32
+               | PFloat
                deriving (Show, Eq, Read)
 
 -- | A Type can either be a primitive or an array type.
@@ -52,6 +53,7 @@ data QOp = QAll | QAny
 -- | Constants.
 data LConst = CBool Bool
             | CInt Int
+            | CFloat Float
             | CNil
             deriving (Show, Eq, Read)
 
diff --git a/src/LogicIR/Fold.hs b/src/LogicIR/Fold.hs
index 2856788..dbed0f9 100644
--- a/src/LogicIR/Fold.hs
+++ b/src/LogicIR/Fold.hs
@@ -15,6 +15,7 @@ type LExprAlgebra r = (LConst -> r, -- LConst
                       )
 
 -- Fold for logical expressions
+foldLExpr :: LExprAlgebra r -> LExpr -> r 
 foldLExpr (fConst, fVar, fUnop, fBinop, fIf, fQuant, fArray, fIsnull, fLen) = fold where
     fold e = case e of
                   LConst c       -> fConst c
diff --git a/src/LogicIR/Frontend/Java.hs b/src/LogicIR/Frontend/Java.hs
index 5f80a7c..4debba0 100644
--- a/src/LogicIR/Frontend/Java.hs
+++ b/src/LogicIR/Frontend/Java.hs
@@ -23,6 +23,7 @@ nameToVar name env decls =
     case arrayType of
         PrimType BooleanT                   -> fromString(symbol ++ ":bool")
         PrimType IntT                       -> fromString(symbol ++ ":int")
+        PrimType FloatT                     -> fromString(symbol ++ ":float")
         RefType (ArrayType (PrimType IntT)) -> fromString(symbol ++ ":[int]")
         _ -> error $ "Unimplemented nameToVar: " ++ show (name, arrayType)
     where
diff --git a/src/LogicIR/Parser.hs b/src/LogicIR/Parser.hs
index feeeb72..ce5c222 100644
--- a/src/LogicIR/Parser.hs
+++ b/src/LogicIR/Parser.hs
@@ -92,7 +92,9 @@ bvarP = do
 typeP :: Parser Type
 typeP = try (TPrim <$> primTypeP) <|> (TArray <$> arrayTypeP)
   where
-    primTypeP = lexeme $ (PBool <$ str "bool") <|> (PInt32 <$ str "int")
+    primTypeP = lexeme (PBool <$ str "bool")
+                   <|> (PInt32 <$ str "int")
+                   <|> (PFloat <$ str "float")
     arrayTypeP = "[" ~> typeP <~ "]"
 
 -- | Useful marcros.
diff --git a/stack.yaml b/stack.yaml
index 5307da2..2dfeca2 100644
--- a/stack.yaml
+++ b/stack.yaml
@@ -49,9 +49,6 @@ packages:
 # (e.g., acme-missiles-0.3)
 extra-deps:
 - z3-4.1.2
-- sbv-7.4
-- crackNum-1.9
-- FloatingHex-0.4
 
 # Override default flag values for local packages and extra-deps
 # flags: {}
-- 
GitLab