From fd9242d7caefdda6921d664ff9bb804ce4676e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com> Date: Sun, 17 Jun 2012 04:32:08 +0200 Subject: [PATCH] testcase folder for regist master thesis results --- .../master-thesis-regis/Arithmetic.scala | 73 ++++++ .../master-thesis-regis/ArrayOperations.scala | 207 ++++++++++++++++++ .../master-thesis-regis/Constraints.scala | 26 +++ .../master-thesis-regis/ListOperations.scala | 146 ++++++++++++ 4 files changed, 452 insertions(+) create mode 100644 testcases/master-thesis-regis/Arithmetic.scala create mode 100644 testcases/master-thesis-regis/ArrayOperations.scala create mode 100644 testcases/master-thesis-regis/Constraints.scala create mode 100644 testcases/master-thesis-regis/ListOperations.scala diff --git a/testcases/master-thesis-regis/Arithmetic.scala b/testcases/master-thesis-regis/Arithmetic.scala new file mode 100644 index 000000000..9173132e0 --- /dev/null +++ b/testcases/master-thesis-regis/Arithmetic.scala @@ -0,0 +1,73 @@ +import leon.Utils._ + +object Arithmetic { + + /* VSTTE 2008 - Dafny paper */ + def mult(x : Int, y : Int): Int = ({ + var r = 0 + if(y < 0) { + var n = y + (while(n != 0) { + r = r - x + n = n + 1 + }) invariant(r == x * (y - n) && 0 <= -n) + } else { + var n = y + (while(n != 0) { + r = r + x + n = n - 1 + }) invariant(r == x * (y - n) && 0 <= n) + } + r + }) ensuring(_ == x*y) + + /* VSTTE 2008 - Dafny paper */ + def add(x : Int, y : Int): Int = ({ + var r = x + if(y < 0) { + var n = y + (while(n != 0) { + r = r - 1 + n = n + 1 + }) invariant(r == x + y - n && 0 <= -n) + } else { + var n = y + (while(n != 0) { + r = r + 1 + n = n - 1 + }) invariant(r == x + y - n && 0 <= n) + } + r + }) ensuring(_ == x+y) + + /* VSTTE 2008 - Dafny paper */ + def addBuggy(x : Int, y : Int): Int = ({ + var r = x + if(y < 0) { + var n = y + (while(n != 0) { + r = r + 1 + n = n + 1 + }) invariant(r == x + y - n && 0 <= -n) + } else { + var n = y + (while(n != 0) { + r = r + 1 + n = n - 1 + }) invariant(r == x + y - n && 0 <= n) + } + r + }) ensuring(_ == x+y) + + def sum(n: Int): Int = { + require(n >= 0) + var r = 0 + var i = 0 + (while(i < n) { + i = i + 1 + r = r + i + }) invariant(r >= i && i >= 0 && r >= 0) + r + } ensuring(_ >= n) + +} diff --git a/testcases/master-thesis-regis/ArrayOperations.scala b/testcases/master-thesis-regis/ArrayOperations.scala new file mode 100644 index 000000000..91eb371fa --- /dev/null +++ b/testcases/master-thesis-regis/ArrayOperations.scala @@ -0,0 +1,207 @@ +import leon.Utils._ + +object ArrayOperations { + + /* VSTTE 2008 - Dafny paper */ + def binarySearch(a: Array[Int], key: Int): Int = ({ + require(a.length > 0 && sorted(a, 0, a.length - 1)) + var low = 0 + var high = a.length - 1 + var res = -1 + + (while(low <= high && res == -1) { + val i = (high + low) / 2 + val v = a(i) + + if(v == key) + res = i + + if(v > key) + high = i - 1 + else if(v < key) + low = i + 1 + }) invariant( + res >= -1 && + res < a.length && + 0 <= low && + low <= high + 1 && + high >= -1 && + high < a.length && + (if (res >= 0) + a(res) == key else + (!occurs(a, 0, low, key) && !occurs(a, high + 1, a.length, key)) + ) + ) + res + }) ensuring(res => + res >= -1 && + res < a.length && + (if(res >= 0) a(res) == key else !occurs(a, 0, a.length, key))) + + + def occurs(a: Array[Int], from: Int, to: Int, key: Int): Boolean = { + require(a.length >= 0 && to <= a.length && from >= 0) + def rec(i: Int): Boolean = { + require(i >= 0) + if(i >= to) + false + else { + if(a(i) == key) true else rec(i+1) + } + } + if(from >= to) + false + else + rec(from) + } + + def sorted(a: Array[Int], l: Int, u: Int): Boolean = { + require(a.length >= 0 && l >= 0 && u < a.length && l <= u) + var k = l + var isSorted = true + (while(k < u) { + if(a(k) > a(k+1)) + isSorted = false + k = k + 1 + }) invariant(k <= u && k >= l) + isSorted + } + + /* The calculus of Computation textbook */ + def bubbleSort(a: Array[Int]): Array[Int] = ({ + require(a.length >= 1) + var i = a.length - 1 + var j = 0 + val sa = a.clone + (while(i > 0) { + j = 0 + (while(j < i) { + if(sa(j) > sa(j+1)) { + val tmp = sa(j) + sa(j) = sa(j+1) + sa(j+1) = tmp + } + j = j + 1 + }) invariant( + j >= 0 && + j <= i && + i < sa.length && + sa.length >= 0 && + partitioned(sa, 0, i, i+1, sa.length-1) && + sorted(sa, i, sa.length-1) && + partitioned(sa, 0, j-1, j, j) + ) + i = i - 1 + }) invariant( + i >= 0 && + i < sa.length && + sa.length >= 0 && + partitioned(sa, 0, i, i+1, sa.length-1) && + sorted(sa, i, sa.length-1) + ) + sa + }) ensuring(res => sorted(res, 0, a.length-1)) + + def partitioned(a: Array[Int], l1: Int, u1: Int, l2: Int, u2: Int): Boolean = { + require(a.length >= 0 && l1 >= 0 && u1 < l2 && u2 < a.length) + if(l2 > u2 || l1 > u1) + true + else { + var i = l1 + var j = l2 + var isPartitionned = true + (while(i <= u1) { + j = l2 + (while(j <= u2) { + if(a(i) > a(j)) + isPartitionned = false + j = j + 1 + }) invariant(j >= l2 && i <= u1) + i = i + 1 + }) invariant(i >= l1) + isPartitionned + } + } + + /* The calculus of Computation textbook */ + def linearSearch(a: Array[Int], c: Int): Boolean = ({ + require(a.length >= 0) + var i = 0 + var found = false + (while(i < a.length) { + if(a(i) == c) + found = true + i = i + 1 + }) invariant( + i <= a.length && + i >= 0 && + (if(found) contains(a, i, c) else !contains(a, i, c)) + ) + found + }) ensuring(res => if(res) contains(a, a.length, c) else !contains(a, a.length, c)) + + def contains(a: Array[Int], size: Int, c: Int): Boolean = { + require(a.length >= 0 && size >= 0 && size <= a.length) + content(a, size).contains(c) + } + + def content(a: Array[Int], size: Int): Set[Int] = { + require(a.length >= 0 && size >= 0 && size <= a.length) + var set = Set.empty[Int] + var i = 0 + (while(i < size) { + set = set ++ Set(a(i)) + i = i + 1 + }) invariant(i >= 0 && i <= size) + set + } + + def abs(tab: Array[Int]): Array[Int] = ({ + require(tab.length >= 0) + var k = 0 + val tabres = Array.fill(tab.length)(0) + (while(k < tab.length) { + if(tab(k) < 0) + tabres(k) = -tab(k) + else + tabres(k) = tab(k) + k = k + 1 + }) invariant( + tabres.length == tab.length && + k >= 0 && k <= tab.length && + isPositive(tabres, k)) + tabres + }) ensuring(res => isPositive(res, res.length)) + + def isPositive(a: Array[Int], size: Int): Boolean = { + require(a.length >= 0 && size <= a.length) + def rec(i: Int): Boolean = { + require(i >= 0) + if(i >= size) + true + else { + if(a(i) < 0) + false + else + rec(i+1) + } + } + rec(0) + } + + /* VSTTE 2010 challenge 1 */ + def maxSum(a: Array[Int]): (Int, Int) = ({ + require(a.length >= 0 && isPositive(a, a.length)) + var sum = 0 + var max = 0 + var i = 0 + (while(i < a.length) { + if(max < a(i)) + max = a(i) + sum = sum + a(i) + i = i + 1 + }) invariant (sum <= i * max && i >= 0 && i <= a.length) + (sum, max) + }) ensuring(res => res._1 <= a.length * res._2) + +} diff --git a/testcases/master-thesis-regis/Constraints.scala b/testcases/master-thesis-regis/Constraints.scala new file mode 100644 index 000000000..6fdd96392 --- /dev/null +++ b/testcases/master-thesis-regis/Constraints.scala @@ -0,0 +1,26 @@ +import leon.Utils._ + +object Epsilon4 { + + sealed abstract class MyList + case class MyCons(head: Int, tail: MyList) extends MyList + case class MyNil() extends MyList + + def size(lst: MyList): Int = (lst match { + case MyNil() => 0 + case MyCons(_, xs) => 1 + size(xs) + }) + + def toSet(lst: MyList): Set[Int] = lst match { + case MyCons(x, xs) => toSet(xs) ++ Set(x) + case MyNil() => Set[Int]() + } + + def toList(set: Set[Int]): MyList = if(set == Set.empty[Int]) MyNil() else { + val elem = epsilon((x : Int) => set contains x) + MyCons(elem, toList(set -- Set[Int](elem))) + } + + def property(lst: MyList): Boolean = (size(toList(toSet(lst))) <= size(lst)) holds + +} diff --git a/testcases/master-thesis-regis/ListOperations.scala b/testcases/master-thesis-regis/ListOperations.scala new file mode 100644 index 000000000..4bb59c264 --- /dev/null +++ b/testcases/master-thesis-regis/ListOperations.scala @@ -0,0 +1,146 @@ +import leon.Utils._ +import leon.Annotations._ + +object ListOperations { + + sealed abstract class List + case class Cons(head: Int, tail: List) extends List + case class Nil() extends List + + sealed abstract class IPList + case class IPCons(head: (Int, Int), tail: IPList) extends IPList + case class IPNil() extends IPList + + def content(l: List) : Set[Int] = l match { + case Nil() => Set.empty[Int] + case Cons(x, xs) => Set(x) ++ content(xs) + } + + def iplContent(l: IPList) : Set[(Int, Int)] = l match { + case IPNil() => Set.empty[(Int, Int)] + case IPCons(x, xs) => Set(x) ++ iplContent(xs) + } + + def size(l: List) : Int = { + var r = 0 + var l2 = l + (while(!l2.isInstanceOf[Nil]) { + val Cons(_, tail) = l2 + l2 = tail + r = r+1 + }) invariant(r >= 0) + r + } ensuring(res => res >= 0) + + def sizeBuggy(l: List) : Int = { + var r = -1 + var l2 = l + (while(!l2.isInstanceOf[Nil]) { + val Cons(_, tail) = l2 + l2 = tail + r = r+1 + }) invariant(r >= 0) + r + } ensuring(res => res >= 0) + + def sizeFun(l: List) : Int = l match { + case Nil() => 0 + case Cons(_, t) => 1 + sizeFun(t) + } + + def iplSizeFun(l: IPList) : Int = l match { + case IPNil() => 0 + case IPCons(_, t) => 1 + iplSizeFun(t) + } + + def iplSize(l: IPList) : Int = { + var r = 0 + var l2 = l + (while(!l2.isInstanceOf[IPNil]) { + val IPCons(_, tail) = l2 + l2 = tail + r = r+1 + }) invariant(r >= 0) + r + } ensuring(_ >= 0) + + def sizeImpEqFun(l: List): Boolean = (size(l) == sizeFun(l)) ensuring(_ == true) + + def zip(l1: List, l2: List) : IPList = ({ + require(sizeFun(l1) == sizeFun(l2)) + var r: IPList = IPNil() + var ll1: List = l1 + var ll2 = l2 + + (while(!ll1.isInstanceOf[Nil]) { + val Cons(l1head, l1tail) = ll1 + val Cons(l2head, l2tail) = if(!ll2.isInstanceOf[Nil]) ll2 else Cons(0, Nil()) + r = IPCons((l1head, l2head), r) + ll1 = l1tail + ll2 = l2tail + }) invariant(iplSizeFun(r) + sizeFun(ll1) == sizeFun(l1)) + + iplReverse(r) + }) ensuring(res => iplSizeFun(res) == sizeFun(l1)) + + def iplReverse(l: IPList): IPList = { + var r: IPList = IPNil() + var l2: IPList = l + + (while(!l2.isInstanceOf[IPNil]) { + val IPCons(head, tail) = l2 + l2 = tail + r = IPCons(head, r) + }) invariant(iplContent(r) ++ iplContent(l2) == iplContent(l) && iplSizeFun(r) + iplSizeFun(l2) == iplSizeFun(l)) + + r + } ensuring(res => iplContent(res) == iplContent(l) && iplSizeFun(res) == iplSizeFun(l)) + + def reverse(l: List): List = { + var r: List = Nil() + var l2: List = l + + (while(!l2.isInstanceOf[Nil]) { + val Cons(head, tail) = l2 + l2 = tail + r = Cons(head, r) + }) invariant(content(r) ++ content(l2) == content(l) && sizeFun(r) + sizeFun(l2) == sizeFun(l)) + + r + } ensuring(res => content(res) == content(l) && sizeFun(res) == sizeFun(l)) + + def listEqReverse(l: List): Boolean = { + l == reverse(l) + } ensuring(_ == true) + + def append(l1 : List, l2 : List) : List = { + var r: List = l2 + var tmp: List = reverse(l1) + + (while(!tmp.isInstanceOf[Nil]) { + val Cons(head, tail) = tmp + tmp = tail + r = Cons(head, r) + }) invariant(content(r) ++ content(tmp) == content(l1) ++ content(l2)) + + r + } ensuring(content(_) == content(l1) ++ content(l2)) + + def appendBuggy(l1 : List, l2 : List) : List = { + var r: List = l2 + var tmp: List = l1 + + while(!tmp.isInstanceOf[Nil]) { + val Cons(head, tail) = tmp + tmp = tail + r = Cons(head, r) + } + + r + } + + def appendEqAppendBuggy(l1: List, l2: List): Boolean = { + append(l1, l2) == appendBuggy(l1, l2) + } ensuring(_ == true) + +} -- GitLab