From aa1c6a512520f06a24221aefb8c50f803625300c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ali=20Sinan=20K=C3=B6ksal?= <alisinan@gmail.com>
Date: Fri, 25 Mar 2011 16:12:22 +0000
Subject: [PATCH] Trying to prove properties with list abstraction but have
 another problem with z3 translation

---
 vstte10competition/AmortizedQueue.scala | 37 +++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/vstte10competition/AmortizedQueue.scala b/vstte10competition/AmortizedQueue.scala
index 055e7042c..7968b415e 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
-- 
GitLab