From bfdb241c5ba0da6e0726bcede09071141e27b9b3 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Wed, 9 Mar 2016 16:11:40 +0100
Subject: [PATCH] Benchmark should use BigInts

---
 testcases/synthesis/future/SortedList.scala | 43 +++++++++++----------
 1 file changed, 23 insertions(+), 20 deletions(-)

diff --git a/testcases/synthesis/future/SortedList.scala b/testcases/synthesis/future/SortedList.scala
index b71f4f67e..973cd4b50 100644
--- a/testcases/synthesis/future/SortedList.scala
+++ b/testcases/synthesis/future/SortedList.scala
@@ -4,41 +4,44 @@ import leon.lang.synthesis._
 
 object SortedList {
   sealed abstract class List
-  case class Cons(head: Int, tail: List) extends List
+  case class Cons(head: BigInt, tail: List) extends List
   case class Nil() extends List
 
   // proved with unrolling=0
-  def size(l: List) : Int = (l match {
-    case Nil() => 0
-    case Cons(_, t) => 1 + size(t)
-  }) ensuring(res => res >= 0)
+  def size(l: List) : BigInt = (l match {
+    case Nil() => BigInt(0)
+    case Cons(_, t) => BigInt(1) + size(t)
+  }) ensuring(res => res >= BigInt(0))
 
-  //def sizeSynth(l: List): Int = choose{ (i: Int) => i >= 0 && sizeSynth(Cons(0, l)) == i + 1}
+  //def sizeSynth(l: List): BigInt = choose{ (i: BigInt) => i >= 0 && sizeSynth(Cons(0, l)) == i + 1}
 
-  def content(l: List): Set[Int] = l match {
+  def content(l: List): Set[BigInt] = l match {
     case Nil() => Set()
     case Cons(i, t) => Set(i) ++ content(t)
   }
 
   def groundSynth() = choose{ (out: List) => size(out) == 5 }
 
-  def insertSynth(in: List, v: Int) = choose{ (out: List) => content(out) == content(in) ++ Set(v) }
+  def insertSynth(in: List, v: BigInt) = choose{ (out: List) => content(out) == content(in) ++ Set(v) }
 
   def tailSynth(in: List) = choose{out: List => size(out)+1 == size(in)}
   def consSynth(in: List) = choose{out: List => size(out) == size(in)+1}
 
-  def listOfSizeSynth(i: Int) = choose{out: List => size(out) == i }
+  def listOfSizeSynth(i: BigInt) = {
+    require(i >= 0)
+    choose { out: List => size(out) == i }
+  }
 
-  def insert1(l: List, v: Int) = (
+  def insert1(l: List, v: BigInt) = (
     Cons(v, l)
   ) ensuring(res => content(res) == content(l) ++ Set(v) && size(res) >= size(l))
 
-  def insert2(l: List, v: Int): List = (l match {
+  def insert2(l: List, v: BigInt): List = (l match {
     case Nil() => Cons(v, Nil())
     case Cons(x, tail) => if (x == v) l else Cons(x, insert2(tail, v))
   }) ensuring(res => content(res) == content(l) ++ Set(v) && size(res) >= size(l))
 
-  def insert3(l: List, v: Int): List = {
+  def insert3(l: List, v: BigInt): List = {
     require(isStrictlySorted(l))
 
     l match {
@@ -54,14 +57,14 @@ object SortedList {
     }
   } ensuring(res => content(res) == content(l) ++ Set(v) && size(res) >= size(l))
 
-  def deleteSynth(in: List, v: Int) = choose{ (out: List) => !(content(out) contains v) }
+  def deleteSynth(in: List, v: BigInt) = choose{ (out: List) => !(content(out) contains v) }
 
-  def delete1(l: List, v: Int): List = (l match {
+  def delete1(l: List, v: BigInt): List = (l match {
       case Nil() => Nil()
       case Cons(x, tail) => if (x == v) delete1(tail, v) else Cons(x, delete1(tail, v))
     }) ensuring(res => !(content(res) contains v) && size(res) <= size(l))
 
-  //def delete2(l: List, v: Int): List = {
+  //def delete2(l: List, v: BigInt): List = {
   //  require(isStrictlySorted(l))
 
   //  l match {
@@ -75,19 +78,19 @@ object SortedList {
   //  }
   //} ensuring(res => !(content(res) contains v) && size(res) <= size(l))
 
-  def contains(list : List, elem : Int) : Boolean = (list match {
+  def contains(list : List, elem : BigInt) : Boolean = (list match {
     case Nil() => false
     case Cons(x, xs) => if(elem == x) true else contains(xs, elem)
   }) ensuring(res => res == content(list).contains(elem))
 
-  def deleteMagic(head: Int, tail: List, toDelete: Int): List = ({
+  def deleteMagic(head: BigInt, tail: List, toDelete: BigInt): List = ({
     //require(isStrictlySorted(Cons(head, tail)) && toDelete < head);
     require(isStrictlySorted(Cons(toDelete, Cons(head, tail))))
 
     Cons(head, tail)
   })ensuring(res => !(content(res) contains toDelete))
 
-  def delete3(l: List, v: Int): List = {
+  def delete3(l: List, v: BigInt): List = {
     require(isStrictlySorted(l))
 
     l match {
@@ -119,7 +122,7 @@ object SortedList {
     case Cons(x, xs) => lessThanAll(x, xs)
   }))
 
-  def lessThanAll(x : Int, l : List) : Boolean = (l match {
+  def lessThanAll(x : BigInt, l : List) : Boolean = (l match {
     case Nil() => true
     case Cons(y, ys) => if(x < y) lessThanAll(x, ys) else false
   }) ensuring(res => !res || !contains(l, x))
@@ -127,7 +130,7 @@ object SortedList {
   def discard(value : Boolean) = true
   
   @induct
-  def ltaLemma(x : Int, y : Int, l : List) : Boolean = {
+  def ltaLemma(x : BigInt, y : BigInt, l : List) : Boolean = {
     require(lessThanAll(y, l) && x < y)
     lessThanAll(x, Cons(y, l))
   } holds 
-- 
GitLab