diff --git a/vstte10competition/AmortizedQueue.scala b/vstte10competition/AmortizedQueue.scala index 055e7042cb6be157a6b7cc5a9266a35b8f8f2ca4..7968b415ed1c83b9f8f2d3652a71f55771f5367e 100644 --- a/vstte10competition/AmortizedQueue.scala +++ b/vstte10competition/AmortizedQueue.scala @@ -19,6 +19,10 @@ object AmortizedQueue { case Nil() => Set.empty[Int] case Cons(x, xs) => Set(x) ++ content(xs) } + + def asList(queue : AbsQueue) : List = queue match { + case Queue(front, rear) => concat(front, reverse(rear)) + } def concat(l1 : List, l2 : List) : List = (l1 match { case Nil() => l2 @@ -64,6 +68,39 @@ object AmortizedQueue { } } + @induct + def propEnqueue(rear : List, front : List, list : List, elem : Int) : Boolean = { + require(isAmortized(Queue(front, rear))) + val queue = Queue(front, rear) + if (asList(queue) == list) { + asList(enqueue(queue, elem)) == concat(list, Cons(elem, Nil())) + } else + true + } // holds + + @induct + def propFront(queue : AbsQueue, list : List, elem : Int) : Boolean = { + require(!isEmpty(queue) && isAmortized(queue)) + if (asList(queue) == list) { + list match { + case Cons(x, _) => front(queue) == x + } + } else + true + } holds + + @induct + def propTail(rear : List, front : List, list : List, elem : Int) : Boolean = { + require(!isEmpty(Queue(front, rear)) && isAmortized(Queue(front, rear))) + val queue = Queue(front, rear) + if (asList(queue) == list) { + list match { + case Cons(_, xs) => asList(tail(queue)) == xs + } + } else + true + } // holds + def enqueueAndFront(queue : AbsQueue, elem : Int) : Boolean = { if (isEmpty(queue)) front(enqueue(queue, elem)) == elem