diff --git a/vstte10competition/SearchLinkedList.scala b/vstte10competition/SearchLinkedList.scala new file mode 100644 index 0000000000000000000000000000000000000000..2aa592a4fa124a82e98629e8fc8f69ec0f6fff63 --- /dev/null +++ b/vstte10competition/SearchLinkedList.scala @@ -0,0 +1,49 @@ +import scala.collection.immutable.Set +import funcheck.Utils._ +import funcheck.Annotations._ + +object SearchLinkedList { + sealed abstract class List + case class Cons(head : Int, tail : List) extends List + case class Nil() extends List + + def size(list : List) : Int = (list match { + case Nil() => 0 + case Cons(_, xs) => 1 + size(xs) + }) ensuring(_ >= 0) + + @induct + def firstZero(list : List) : Int = (list match { + case Nil() => 0 + case Cons(x, xs) => if (x == 0) 0 else firstZero(xs) + 1 + }) ensuring (res => if (!contains(list, 0)) res == size(list) else zeroAt(list, res)) + + def zeroAt(list : List, pos : Int) : Boolean = { + require(pos >= 0) + list match { + case Nil() => false + case Cons(x, xs) => if (pos == 0) x == 0 else zeroAt(xs, pos - 1) + } + } + + def prop0(list : List, pos : Int) : Boolean = { + require(pos >= 0) + list match { + case Nil() => true + case Cons(x, xs) => if (zeroAt(xs, pos)) zeroAt(list, pos + 1) else true + } + } holds + + def firstZeroAtPos(list : List, pos : Int) : Boolean = { + require(pos >= 0) + list match { + case Nil() => false + case Cons(x, xs) => if (pos == 0) x == 0 else x != 0 && firstZeroAtPos(xs, pos - 1) + } + } ensuring (res => if (res) contains(list, 0) else true) + + def contains(list : List, elem : Int) : Boolean = (list match { + case Nil() => false + case Cons(x, xs) => x == elem || contains(xs, elem) + }) +}