diff --git a/vstte10competition/SearchLinkedList.scala b/vstte10competition/SearchLinkedList.scala index 2aa592a4fa124a82e98629e8fc8f69ec0f6fff63..d14b9fee6c000c5cc703a6e3b97af4ee1eba5562 100644 --- a/vstte10competition/SearchLinkedList.scala +++ b/vstte10competition/SearchLinkedList.scala @@ -12,38 +12,37 @@ object SearchLinkedList { case Cons(_, xs) => 1 + size(xs) }) ensuring(_ >= 0) - @induct + def contains(list : List, elem : Int) : Boolean = (list match { + case Nil() => false + case Cons(x, xs) => x == elem || contains(xs, elem) + }) + 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 + }) ensuring (res => + res >= 0 && (if (contains(list, 0)) { + firstZeroAtPos(list, res) + } else { + res == size(list) + })) 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) - }) + def goal(list : List, i : Int) : Boolean = { + if(firstZero(list) == i) { + if(contains(list, 0)) { + firstZeroAtPos(list, i) + } else { + i == size(list) + } + } else { + true + } + } holds }