From 5fcdb73e544e3f51781a06544ab6794f21f6492b Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Fri, 18 Mar 2016 17:30:43 +0100 Subject: [PATCH] Simplify a benchmark --- .../scala/leon/synthesis/Synthesizer.scala | 2 +- testcases/synthesis/future/SortedList.scala | 129 +++--------------- 2 files changed, 17 insertions(+), 114 deletions(-) diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index 70b8c88e1..0a668a059 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -3,7 +3,7 @@ package leon package synthesis -import leon.purescala.Expressions.Choose +import purescala.Expressions.Choose import purescala.Definitions._ import purescala.ExprOps._ import purescala.DefOps._ diff --git a/testcases/synthesis/future/SortedList.scala b/testcases/synthesis/future/SortedList.scala index 973cd4b50..f02adaba2 100644 --- a/testcases/synthesis/future/SortedList.scala +++ b/testcases/synthesis/future/SortedList.scala @@ -14,130 +14,33 @@ object SortedList { }) ensuring(res => res >= BigInt(0)) //def sizeSynth(l: List): BigInt = choose{ (i: BigInt) => i >= 0 && sizeSynth(Cons(0, l)) == i + 1} - +/* 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: BigInt) = choose{ (out: List) => content(out) == content(in) ++ Set(v) } + def groundSynth() = Cons(0, Cons(1, Cons(2, Cons(3, Cons(4, Nil()))))) ensuring { + (out: List) => size(out) == 5 + } - 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 insertSynth(in: List, v: BigInt) = Cons(v, in) ensuring { + (out: List) => content(out) == content(in) ++ Set(v) + } + def tailSynth(in: List) = { + require(in != Nil()) + in match { + case Cons(_, tl) => tl + } + } ensuring { + out: List => size(out)+1 == size(in) + } +*/ def listOfSizeSynth(i: BigInt) = { require(i >= 0) choose { out: List => size(out) == i } } - 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: 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: BigInt): List = { - require(isStrictlySorted(l)) - - l match { - case Nil() => Cons(v, Nil()) - case Cons(x, tail) => - if (v < x) { - Cons(v, l) - } else if (v == x) { - l - } else { - Cons(x, insert3(tail, v)) - } - } - } ensuring(res => content(res) == content(l) ++ Set(v) && size(res) >= size(l)) - - def deleteSynth(in: List, v: BigInt) = choose{ (out: List) => !(content(out) contains v) } - - 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: BigInt): List = { - // require(isStrictlySorted(l)) - // l match { - // case Nil() => Nil() - // case Cons(x, tail) => - // if (x == v) { - // tail - // } else { - // Cons(x, delete2(tail, v)) - // } - // } - //} ensuring(res => !(content(res) contains v) && size(res) <= size(l)) - - 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: 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: BigInt): List = { - require(isStrictlySorted(l)) - - l match { - case Nil() => Nil() - case Cons(x, tail) => - if (x == v) { - tail - } else if (v < x) { - deleteMagic(x, tail, v) - } else { - Cons(x, delete3(tail, v)) - } - } - } ensuring(res => !(content(res) contains v) && size(res) <= size(l)) - - @induct - def isStrictlySorted(l: List): Boolean = (l match { - case Nil() => true - case Cons(x, Nil()) => true - case Cons(x, xs @ Cons(y, ys)) => { - if(x < y) { - if(isStrictlySorted(xs)) discard(ltaLemma(x, y, ys)) else false - } else { - false - } - } - }) ensuring(res => !res || (l match { - case Nil() => true - case Cons(x, xs) => lessThanAll(x, xs) - })) - - 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)) - - def discard(value : Boolean) = true - - @induct - def ltaLemma(x : BigInt, y : BigInt, l : List) : Boolean = { - require(lessThanAll(y, l) && x < y) - lessThanAll(x, Cons(y, l)) - } holds - - def isSorted(l: List): Boolean = l match { - case Nil() => true - case Cons(x, Nil()) => true - case Cons(x, Cons(y, ys)) => x <= y && isSorted(Cons(y, ys)) - } } -- GitLab