From c4c715fe44fccd9837fc41a8c520aa9e4ff496fd Mon Sep 17 00:00:00 2001
From: Regis Blanc <regwblanc@gmail.com>
Date: Fri, 10 Jul 2015 19:01:15 +0200
Subject: [PATCH] real numbers trees and frontend

---
 library/lang/Real.scala                       | 17 ++++++++++++
 .../leon/frontends/scalac/ASTExtractors.scala | 14 ++++++++++
 .../frontends/scalac/CodeExtraction.scala     | 21 +++++++++++++++
 .../scala/leon/purescala/Expressions.scala    | 26 +++++++++++++++++++
 src/main/scala/leon/purescala/Types.scala     |  1 +
 5 files changed, 79 insertions(+)
 create mode 100644 library/lang/Real.scala

diff --git a/library/lang/Real.scala b/library/lang/Real.scala
new file mode 100644
index 000000000..3e94b27c0
--- /dev/null
+++ b/library/lang/Real.scala
@@ -0,0 +1,17 @@
+package leon.lang
+import leon.annotation._
+
+@ignore
+class Real {
+
+   def +(a: Real): Real = ???
+   def -(a: Real): Real = ???
+   def *(a: Real): Real = ???
+   def /(a: Real): Real = ???
+
+   def unary_- : Real = ???
+}
+
+object Real {
+  def apply(n: BigInt, d: BigInt): Real = ???
+}
diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
index 402a7d7cf..348680e6e 100644
--- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
+++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
@@ -40,6 +40,7 @@ trait ASTExtractors {
   protected lazy val scalaSetSym        = classFromName("scala.collection.immutable.Set")
   protected lazy val setSym             = classFromName("leon.lang.Set")
   protected lazy val mapSym             = classFromName("leon.lang.Map")
+  protected lazy val realSym            = classFromName("leon.lang.Real")
   protected lazy val optionClassSym     = classFromName("scala.Option")
   protected lazy val arraySym           = classFromName("scala.Array")
   protected lazy val someClassSym       = classFromName("scala.Some")
@@ -72,6 +73,10 @@ trait ASTExtractors {
     getResolvedTypeSym(sym) == setSym
   }
 
+  def isRealSym(sym: Symbol) : Boolean = {
+    getResolvedTypeSym(sym) == realSym
+  }
+
   def isScalaSetSym(sym: Symbol) : Boolean = {
     getResolvedTypeSym(sym) == scalaSetSym
   }
@@ -242,6 +247,15 @@ trait ASTExtractors {
       }
     }
 
+    object ExRealLiteral {
+      def unapply(tree: Tree): Option[(Tree, Tree)] = tree  match {
+        case Apply(ExSelected("leon", "lang", "Real", "apply"), n :: d :: Nil) =>
+          Some((n, d))
+        case _ =>
+          None
+      }
+    }
+
 
     object ExIntToBigInt {
       def unapply(tree: Tree): Option[Tree] = tree  match {
diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index 1e995aaf6..d7cab0c0a 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -1213,6 +1213,9 @@ trait CodeExtraction extends ASTExtractors {
           }
         }
 
+        case ExRealLiteral(n: Literal, d: Literal) =>
+          RealLiteral((BigInt(n.value.stringValue), BigInt(d.value.stringValue)))
+
         case ExInt32Literal(v) =>
           IntLiteral(v)
 
@@ -1505,6 +1508,24 @@ trait CodeExtraction extends ASTExtractors {
             case (IsTyped(a1, IntegerType), "<=", List(IsTyped(a2, IntegerType))) =>
               LessEquals(a1, a2)
 
+            //Real methods
+            case (IsTyped(a1, RealType), "+", List(IsTyped(a2, RealType))) =>
+              RealPlus(a1, a2)
+            case (IsTyped(a1, RealType), "-", List(IsTyped(a2, RealType))) =>
+              RealMinus(a1, a2)
+            case (IsTyped(a1, RealType), "*", List(IsTyped(a2, RealType))) =>
+              RealTimes(a1, a2)
+            case (IsTyped(a1, RealType), "/", List(IsTyped(a2, RealType))) =>
+              RealDivision(a1, a2)
+            case (IsTyped(a1, RealType), ">", List(IsTyped(a2, RealType))) =>
+              GreaterThan(a1, a2)
+            case (IsTyped(a1, RealType), ">=", List(IsTyped(a2, RealType))) =>
+              GreaterEquals(a1, a2)
+            case (IsTyped(a1, RealType), "<", List(IsTyped(a2, RealType))) =>
+              LessThan(a1, a2)
+            case (IsTyped(a1, RealType), "<=", List(IsTyped(a2, RealType))) =>
+              LessEquals(a1, a2)
+
             // Int methods
             case (IsTyped(a1, Int32Type), "+", List(IsTyped(a2, Int32Type))) =>
               BVPlus(a1, a2)
diff --git a/src/main/scala/leon/purescala/Expressions.scala b/src/main/scala/leon/purescala/Expressions.scala
index c25f9be43..12900e3ec 100644
--- a/src/main/scala/leon/purescala/Expressions.scala
+++ b/src/main/scala/leon/purescala/Expressions.scala
@@ -274,6 +274,9 @@ object Expressions {
   case class InfiniteIntegerLiteral(value: BigInt) extends Literal[BigInt] {
     val getType = IntegerType
   }
+  case class RealLiteral(value: (BigInt, BigInt)) extends Literal[(BigInt, BigInt)] {
+    val getType = RealType
+  }
 
   case class BooleanLiteral(value: Boolean) extends Literal[Boolean] {
     val getType = BooleanType
@@ -482,6 +485,29 @@ object Expressions {
   }
 
 
+  /* Integer arithmetic */
+  case class RealPlus(lhs: Expr, rhs: Expr) extends Expr {
+    require(lhs.getType == RealType && rhs.getType == RealType)
+    val getType = RealType
+  }
+  case class RealMinus(lhs: Expr, rhs: Expr) extends Expr { 
+    require(lhs.getType == RealType && rhs.getType == RealType)
+    val getType = RealType
+  }
+  case class RealUMinus(expr: Expr) extends Expr { 
+    require(expr.getType == RealType)
+    val getType = RealType
+  }
+  case class RealTimes(lhs: Expr, rhs: Expr) extends Expr { 
+    require(lhs.getType == RealType && rhs.getType == RealType)
+    val getType = RealType
+  }
+  case class RealDivision(lhs: Expr, rhs: Expr) extends Expr { 
+    require(lhs.getType == RealType && rhs.getType == RealType)
+    val getType = RealType
+  }
+
+
   /* Tuple operations */
 
   // If you are not sure about the requirement you should use
diff --git a/src/main/scala/leon/purescala/Types.scala b/src/main/scala/leon/purescala/Types.scala
index 6bb1f921d..3754b8534 100644
--- a/src/main/scala/leon/purescala/Types.scala
+++ b/src/main/scala/leon/purescala/Types.scala
@@ -47,6 +47,7 @@ object Types {
   case object UnitType extends TypeTree
   case object CharType extends TypeTree
   case object IntegerType extends TypeTree
+  case object RealType extends TypeTree
 
   case class BitVectorType(size: Int) extends TypeTree
   case object Int32Type extends TypeTree
-- 
GitLab