diff --git a/vstte10competition/Injection.scala b/vstte10competition/Injection.scala new file mode 100644 index 0000000000000000000000000000000000000000..ac8077e5385f47cfdfdaf47d1608810d0d5f423f --- /dev/null +++ b/vstte10competition/Injection.scala @@ -0,0 +1,78 @@ +import scala.collection.immutable.Set +import funcheck.Utils._ +import funcheck.Annotations._ + +object Injection { + sealed abstract class List + case class Cons(head : Int, tail : List) extends List + case class Nil() extends List + + sealed abstract class OptionInt + case class Some(value : Int) extends OptionInt + case class None() extends OptionInt + + def size(list : List) : Int = (list match { + case Nil() => 0 + case Cons(_, xs) => 1 + size(xs) + }) ensuring(_ >= 0) + + def content(list : List) : Set[Int] = list match { + case Nil() => Set.empty[Int] + case Cons(x, xs) => content(xs) ++ Set(x) + } + + def completeSet(n : Int) : Set[Int] = if(n <= 0) { + Set.empty[Int] + } else { + completeSet(n-1) ++ Set(n-1) + } + + def at(list : List, i : Int) : OptionInt = { + if(i < 0) None() else list match { + case Nil() => None() + case Cons(x, _) if i == 0 => Some(x) + case Cons(_, xs) => at(xs, i - 1) + } + } ensuring(res => (res == None()) == (i < 0 || i >= size(list))) + + def reverse(l: List) : List = reverse0(l, Nil()) + def reverse0(l1: List, l2: List) : List = (l1 match { + case Nil() => l2 + case Cons(x, xs) => reverse0(xs, Cons(x, l2)) + }) ensuring(res => + size(res) == size(l1) + size(l2) && + content(res) == content(l1) ++ content(l2)) + + def isPermutation(list : List, n : Int) : Boolean = { + n < 0 || (size(list) == n && content(list) == completeSet(n)) + } + def prop0(list : List, n : Int) : Boolean = { + require(n >= 0 && isPermutation(list, n)) + isPermutation(reverse(list), n) + } holds + + def indexOf(e : Int, list : List) : Int = (list match { + case Nil() => 0 + case Cons(x, xs) => if (x == e) 0 else 1 + indexOf(e, xs) + }) ensuring(res => (res == size(list)) == !content(list).contains(e)) + + // def invert(list : List, n : Int) : List = { + // require(isPermutation(list, n)) + // list + // } ensuring(res => isPermutation(res, n)) + + def f(list : List, n : Int) = f0(list, n, n-1, Nil()) + def f0(list : List, n : Int, c : Int, acc : List) : List = { + require(isPermutation(list, n) && c <= n) + if(c < 0) { + acc + } else { + f0(list, n, c-1, Cons(indexOf(c, list), acc)) + } + } ensuring(res => content(acc) -- completeSet(n) == Set.empty) + + def main(args : Array[String]) : Unit = { + val test = Cons(9, Cons(3, Cons(8, Cons(2, Cons(7, Cons(4, Cons(0, Cons(1, Cons(5, Cons(6, Nil())))))))))) + println(f(test, size(test))) + } +} diff --git a/vstte10competition/SumAndMax.scala b/vstte10competition/SumAndMax.scala index 973eb3cf7738cab8cd98df77fb81d7be0525b9f1..c4265e25b6e1846a5a0b8e47f1d8f224229131c0 100644 --- a/vstte10competition/SumAndMax.scala +++ b/vstte10competition/SumAndMax.scala @@ -1,4 +1,3 @@ -import scala.collection.immutable.Set import funcheck.Utils._ import funcheck.Annotations._