diff --git a/testcases/buggyEpsilon.scala b/testcases/buggyEpsilon.scala new file mode 100644 index 0000000000000000000000000000000000000000..b558511a036e9f7b216383e959978ca68de15068 --- /dev/null +++ b/testcases/buggyEpsilon.scala @@ -0,0 +1,81 @@ +import leon.Utils._ + +object Test { + + abstract class SortedList + case class Cons(head: Int, tail: SortedList) extends SortedList + case class Nil() extends SortedList + + def content(l: SortedList): Set[Int] = l match { + case Cons(head, tail) => content(tail) ++ Set(head) + case Nil() => Set() + } + + def insert(x: Int, l: SortedList): SortedList = Cons(x, l) + + def remove(x: Int, l: SortedList): SortedList = { + //require(pos(l) && sorted(l, 0)) + l match { + case Cons(head, tail) => if(head == x) remove(x, tail) else if(head < x) Cons(head, remove(x, tail)) else l + case Nil() => Nil() + } + } //ensuring(res => !content(res).contains(x)) + + def sorted(l: SortedList, prec: Int): Boolean = l match { + case Cons(head, tail) => if(prec <= head) sorted(tail, head) else false + case Nil() => true + } + def pos(l: SortedList): Boolean = l match { + case Cons(head, tail) => if(head < 0) false else pos(tail) + case Nil() => true + } + + + + def nonDeterministicList(): Boolean = { + var i = 0 + var b = epsilon((x: Boolean) => i==i) + var b2 = false + var n = 0 + var list: SortedList = Nil() + var error = false + + //(while(b) { + i = i + 1 + b = epsilon((x: Boolean) => i==i) + b2 = epsilon((x: Boolean) => i==i) + n = epsilon((x: Int) => x >= 0) + if(b2) + list = insert(n, list) + else { + list = remove(n, list) + if(content(list).contains(n)) + error = true + } + i = i + 1 + b = epsilon((x: Boolean) => i==i) + b2 = epsilon((x: Boolean) => i==i) + n = epsilon((x: Int) => x >= 0) + if(b2) + list = insert(n, list) + else { + list = remove(n, list) + if(content(list).contains(n)) + error = true + } + i = i + 1 + b = epsilon((x: Boolean) => i==i) + b2 = epsilon((x: Boolean) => i==i) + n = epsilon((x: Int) => x >= 0) + if(b2) + list = insert(n, list) + else { + list = remove(n, list) + if(content(list).contains(n)) + error = true + } + //}) //invariant(pos(list) && sorted(list, 0)) + error + } ensuring(err => !err) //ensuring(_ == Nil()) + +}