diff --git a/testcases/SimpInterpret.scala b/testcases/SimpInterpret.scala new file mode 100644 index 0000000000000000000000000000000000000000..bcb7bafc8648364441b380f06933ecf602b1d6f4 --- /dev/null +++ b/testcases/SimpInterpret.scala @@ -0,0 +1,67 @@ +//import scala.collection.immutable.Set +//import leon.Annotations._ +import leon.Utils._ + +object Interpret { + abstract class BoolTree + case class Eq(t1 : IntTree, t2 : IntTree) extends BoolTree + case class And(t1 : BoolTree, t2 : BoolTree) extends BoolTree + case class Not(t : BoolTree) extends BoolTree + + abstract class IntTree + case class Const(c:Int) extends IntTree + case class Var() extends IntTree + case class Plus(t1 : IntTree, t2 : IntTree) extends IntTree + case class Minus(t1 : IntTree, t2 : IntTree) extends IntTree + case class Less(t1 : IntTree, t2 : IntTree) extends BoolTree + case class If(cond : BoolTree, t : IntTree, e : IntTree) extends IntTree + + def repOk(t : IntTree) : Boolean = { + true + } + + def beval(t:BoolTree, x0 : Int) : Boolean = { + t match { + case Less(t1, t2) => ieval(t1,x0) < ieval(t2,x0) + case Eq(t1, t2) => ieval(t1,x0) == ieval(t2,x0) + case And(t1, t2) => beval(t1,x0) && beval(t2,x0) + case Not(t1) => !beval(t1,x0) + } + } + + def ieval(t:IntTree, x0 : Int) : Int = { + t match { + case Const(c) => c + case Var() => x0 + case Plus(t1,t2) => ieval(t1,x0) + ieval(t2,x0) + case Minus(t1, t2) => ieval(t1,x0) - ieval(t2,x0) + case If(c,t1,t2) => if (beval(c,x0)) ieval(t1,x0) else ieval(t2,x0) + } + } + def computesPositive(t : IntTree) : Boolean = { + ieval(t,0) >= 0 && + ieval(t,1) >= 0 && + ieval(t,-1) >= 0 && + ieval(t,-2) >= 0 && + ieval(t,2) >= 0 + } + def identityForPositive(t : IntTree) : Boolean = { + ieval(t, 5) == 5 && + ieval(t, 33) == 33 && + ieval(t, 0) == 0 && + ieval(t, -1) == 1 && + ieval(t, -2) == 2 + } + + def treeBad(t : IntTree) : Boolean = { + !(repOk(t) && computesPositive(t) && identityForPositive(t)) + } holds + + def thereIsGoodTree() : Boolean = { + !treeBad(If(Less(Const(0),Var()), Var(), Minus(Const(0),Var()))) + } holds + + def main(args : Array[String]) { + thereIsGoodTree() + } +} diff --git a/testcases/synthesis/cav2013/ListByExample.scala b/testcases/synthesis/cav2013/ListByExample.scala new file mode 100644 index 0000000000000000000000000000000000000000..b1f0767749b886ede0fc48153d2d063c00301027 --- /dev/null +++ b/testcases/synthesis/cav2013/ListByExample.scala @@ -0,0 +1,61 @@ +import scala.collection.immutable.Set +import leon.Annotations._ +import leon.Utils._ + +object Lists { + sealed abstract class List + case class Cons(head: Int, tail: List) extends List + case class Nil() extends List + + def size(l:List): Int = (l match { + case Nil() => 0 + case Cons(h,t) => 1 + size(t) + }) ensuring(res => res >= 0) + + def listUp(a:Int,b:Int) : List = { + require(a <= b) + if (a == b) Cons(a,Nil()) + else Cons(a, listUp(a+1,b)) + } ensuring (res => size(res)==1+b-a) + + def listUp_syn(a:Int,b:Int) : List = { + require(a <= b) + choose((res:List) => + size(res)==1+b-a && + (!(a==5 && b==9) || res==Cons(5,Cons(6,Cons(7,Cons(8,Cons(9,Nil())))))) && + (!(a==100 && b==105) || + res==Cons(100,Cons(101,Cons(102,Cons(103,Cons(104,Cons(105,Nil()))))))) + ) + } + + def listDown(a:Int,b:Int) : List = { + require(a >= b) + if (a == b) Cons(a,Nil()) + else Cons(a, listUp(a-1,b)) + } ensuring (res => size(res)==1+b-a) + + def listDown_syn(a:Int,b:Int) : List = { + require(a >= b) + choose((res:List) => + size(res)==1+b-a && + (!(a==9 && b==5) || res==Cons(9,Cons(8,Cons(7,Cons(6,Cons(5,Nil())))))) && + (!(a==105 && b==100) || + res==Cons(105,Cons(104,Cons(103,Cons(102,Cons(101,Cons(100,Nil()))))))) + ) + } + + def concat_syn(a:List, b:List) : List = { + choose((res:List) => + size(res) == size(a) + size(b) && + (!(a==listUp(1,5) && b==listUp(6,9)) || + res==listUp(1,9)) && + (!(a==listUp(101,105) && b==listUp(106,109)) || + res==listUp(101,109)) && + (!(a==listUp(201,205) && b==listUp(206,209)) || + res==listUp(201,209)) && + (!(a==listUp(301,304) && b==listUp(304,310)) || + res==listUp(301,310)) + ) + } + +} diff --git a/testcases/synthesis/cav2013/SynTreeListSet.scala b/testcases/synthesis/cav2013/SynTreeListSet.scala index 5639d9799cad085df44a05953daade15125a1102..eae01213973d787269a98afaf00721167d4d8848 100644 --- a/testcases/synthesis/cav2013/SynTreeListSet.scala +++ b/testcases/synthesis/cav2013/SynTreeListSet.scala @@ -30,15 +30,28 @@ object BinaryTree { case Cons(i, t) => Set(i) ++ l2s(t) } - def l2s_syn(l:List):Set[Int] = { + def listFrom(k:Int) : List = { + require(0 <= k) + if (k==0) Nil() + else Cons(k, listFrom(k-1)) + } + def setFrom(k:Int) : Set[Int] = { + require(0 <= k) + if (k==0) Set.empty[Int] + else Set(k) ++ setFrom(k-1) + } + + def l2s_syn(l:List,k:Int):Set[Int] = { + require(0 <= k) choose((res:Set[Int]) => - l match { + (l!=listFrom(k) || res==setFrom(k)) && + (l match { case Nil() => (res==Set.empty[Int]) case Cons(x,Nil()) => res==Set(x) case Cons(x,Cons(y,Nil())) => res==Set(x,y) case Cons(x1,Cons(x2,Cons(x3,Cons(x4,Nil())))) => res==Set(x1,x2,x3,x4) case _ => true - } + }) ) }