From f7d66ba42610229770a704cf054c74f079e37cfc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ali=20Sinan=20K=C3=B6ksal?= <alisinan@gmail.com>
Date: Fri, 19 Nov 2010 09:01:50 +0000
Subject: [PATCH] Some modification to examples and some evaluation summary

---
 evaluation_results                       | 139 +++++++++++++++++++++++
 pldi2011-testcases/AssociativeList.scala |  31 ++---
 testcases/ListWithSize.scala             |  21 +---
 3 files changed, 150 insertions(+), 41 deletions(-)
 create mode 100644 evaluation_results

diff --git a/evaluation_results b/evaluation_results
new file mode 100644
index 000000000..3e0269aec
--- /dev/null
+++ b/evaluation_results
@@ -0,0 +1,139 @@
+testcases/ListWithSize.scala
+
+verifies: associativity of append, size
+
+size                      match.      (11,34) valid               Z3        0.266
+size                      postcond.           valid               Z3        0.031
+content                   match.      (16,41) valid               Z3        0.002
+sizeAndContent            postcond.           valid               Z3        0.007
+drunk                     match.      (25,37) valid               Z3        0.002
+drunk                     postcond.           valid               Z3        0.406
+funnyCons                 match.      (31,48) valid               Z3        0.005
+funnyCons                 postcond.           valid               Z3        0.154
+reverse0                  match.      (38,50) valid               Z3        0.004
+append                    match.      (43,51) valid               Z3        0.002
+nilAppend                 postcond.           valid    induction  Z3        0.004
+nilAppend                 postcond.           valid    induction  Z3        0.003
+appendFold                postcond.           valid               Z3        0.006
+appendAssoc               postcond.           valid    induction  Z3        0.005
+appendAssoc               postcond.           valid    induction  Z3        0.006
+sizeAppend                postcond.           valid    induction  Z3        0.006
+sizeAppend                postcond.           valid    induction  Z3        0.011
+concat0                   match.      (67,60) valid               Z3        0.002
+concat0                   match.      (68,24) valid               Z3        0.002
+property1                 postcond.           unknown                            
+
+  @induct
+  def nilAppend(l : List) : Boolean = (append(l, Nil()) == l) holds
+
+  @induct
+  def appendAssoc(xs : List, ys : List, zs : List) : Boolean =
+    (append(append(xs, ys), zs) == append(xs, append(ys, zs))) holds
+
+  @induct
+  def sizeAppend(l1 : List, l2 : List) : Boolean =
+   (size(append(l1, l2)) == size(l1) + size(l2)) holds
+
+==============================
+
+AssociativeList.scala
+
+verifies: update of elements, content
+
+domain                    match.      (17,37) valid               Z3        0.258
+find                      match.      (22,41) valid               Z3        0.003
+noDuplicates              match.      (27,42) valid               Z3        0.003
+update                    match.      (32,46) valid               Z3        0.003
+update                    postcond.           valid               Z3        0.083
+updateElem                match.      (37,58) valid               Z3        0.006
+updateElem                match.      (39,44) valid               Z3        0.005
+updateElem                postcond.           valid               Z3        0.132
+updateElemProp1           match.      (47,75) valid    induction  Z3        0.005
+updateElemProp1           postcond.           valid    induction  Z3        0.040
+updateElemProp1           postcond.           valid    induction  Z3        0.022
+
+  def update(l1: List, l2: List): List = (l2 match {
+    case Nil() => l1
+    case Cons(x, xs) => update(updateElem(l1, x), xs)
+  }) ensuring(domain(_) == domain(l1) ++ domain(l2))
+
+  def updateElem(l: List, e: KeyValuePairAbs): List = (l match {
+    case Nil() => Cons(e, Nil())
+    case Cons(KeyValuePair(k, v), xs) => e match {
+      case KeyValuePair(ek, ev) => if (ek == k) updateElem(xs, e) else Cons(KeyValuePair(k, v), updateElem(xs, e))
+    }
+  }) ensuring(res => e match {
+    case KeyValuePair(k, v) => domain(res) == domain(l) ++ Set[Int](k)
+  })
+
+  @induct
+  def updateElemProp1(l: List, e: KeyValuePairAbs, k: Int) : Boolean = (e match {
+    case KeyValuePair(key, value) =>
+      find(updateElem(l, e), k) == (if (k == key) Some(value) else find(l, k))
+  }) holds
+
+==============================
+
+InsertionSort.scala
+
+verifies: content, sortedness
+
+size                      match.      (13,33) valid               Z3        0.254
+size                      postcond.           valid               Z3        0.031
+contents                  match.      (18,39) valid               Z3        0.002
+min                       match.      (23,34) valid               Z3        0.002
+min                       match.      (25,33) valid               Z3        0.003
+minProp0                  match.      (31,41) valid               Z3        0.003
+minProp0                  match.      (33,36) valid               Z3        0.003
+minProp0                  postcond.           valid               Z3        0.009
+minProp1                  match.       (41,7) valid               Z3        0.004
+minProp1                  match.      (43,38) valid               Z3        0.004
+minProp1                  postcond.           valid               Z3        0.338
+isSorted                  match.      (50,38) valid               Z3        0.004
+sortedIns                 precond.    (60,54) valid               Z3        0.011
+sortedIns                 match.       (58,7) valid               Z3        0.004
+sortedIns                 postcond.           valid               Z3        0.055
+sort                      precond.    (66,33) valid               Z3        0.009
+sort                      match.      (64,32) valid               Z3        0.003
+sort                      postcond.           valid               Z3        0.051
+
+  def sortedIns(e: Int, l: List): List = {
+    require(isSorted(l))
+    l match {
+      case Nil() => Cons(e,Nil())
+      case Cons(x,xs) => if (x <= e) Cons(x,sortedIns(e, xs)) else Cons(e, l)
+    } 
+  } ensuring(res => contents(res) == contents(l) ++ Set(e) && isSorted(res))
+
+  def sort(l: List): List = (l match {
+    case Nil() => Nil()
+    case Cons(x,xs) => sortedIns(x, sort(xs))
+  }) ensuring(res => contents(res) == contents(l) && isSorted(res))
+
+==============================
+
+RedBlackTree.scala
+
+verifies: content, "red nodes have black children"
+
+content                   match.      (13,39) valid               Z3        0.269
+size                      match.      (18,31) valid               Z3        0.002
+redNodesHaveBlackChildren match.      (30,56) valid               Z3        0.002
+redDescHaveBlackChildren  match.      (36,55) valid               Z3        0.002
+ins                       precond.    (46,33) valid               Z3        0.539
+ins                       precond.    (46,40) valid               Z3        0.010
+ins                       precond.    (48,33) valid               Z3        0.338
+ins                       precond.    (48,43) valid               Z3        0.007
+ins                       match.       (43,7) valid               Z3        0.002
+ins                       postcond.           valid               Z3        1.801
+makeBlack                 postcond.           valid               Z3        0.035
+add                       precond.    (65,14) valid               Z3        0.014
+add                       precond.    (65,18) valid               Z3        0.003
+add                       postcond.           valid               Z3        0.029
+balance                   match.      (94,19) valid               Z3        0.028
+balance                   postcond.           valid               Z3        0.999
+
+  def add(x: Int, t: Tree): Tree = {
+    require(redNodesHaveBlackChildren(t))
+    makeBlack(ins(x, t))
+  } ensuring (res => content(res) == content(t) ++ Set(x) && redNodesHaveBlackChildren(res))
diff --git a/pldi2011-testcases/AssociativeList.scala b/pldi2011-testcases/AssociativeList.scala
index e6fd05b68..66fe11efb 100644
--- a/pldi2011-testcases/AssociativeList.scala
+++ b/pldi2011-testcases/AssociativeList.scala
@@ -19,10 +19,10 @@ object AssociativeList {
     case Cons(KeyValuePair(k,_), xs) => Set(k) ++ domain(xs)
   }
 
-  // def content(l: List): Set[KeyValuePairAbs] = l match {
-  //   case Nil() => Set.empty[KeyValuePairAbs]
-  //   case Cons(KeyValuePair(k, v), xs) => Set(KeyValuePair(k, v)) ++ content(xs)
-  // }
+  def find(l: List, e: Int): OptInt = l match {
+    case Nil() => None()
+    case Cons(KeyValuePair(k, v), xs) => if (k == e) Some(v) else find(xs, e)
+  }
 
   def noDuplicates(l: List): Boolean = l match {
     case Nil() => true
@@ -44,28 +44,13 @@ object AssociativeList {
   })
 
   @induct
-  def updateElemProp1(l: List, e: KeyValuePairAbs, k: Int) : Boolean = {
-    e match {
-      case KeyValuePair(key, value) =>
-        find(updateElem(l, e), k) == (if (k == key) Some(key) else find(l, k))
-    }
-  } holds
-
-  def updateElemProp1(l: List, e: KeyValuePairAbs, k: Int) : Boolean = {
-    e match {
-      case KeyValuePair(key, value) =>
-        find(updateElem(l, e), k) == (if (k == key) Some(key) else find(l, k))
-    }
-  } holds
-
+  def updateElemProp1(l: List, e: KeyValuePairAbs, k: Int) : Boolean = (e match {
+    case KeyValuePair(key, value) =>
+      find(updateElem(l, e), k) == (if (k == key) Some(value) else find(l, k))
+  }) holds
 
   // def prop0(e: Int): Boolean = (find(update(Nil(), Nil()), e) == find(Nil(), e)) holds
 
-  def find(l: List, e: Int): OptInt = l match {
-    case Nil() => None()
-    case Cons(KeyValuePair(k, v), xs) => if (k == e) Some(v) else find(xs, e)
-  }
-
   def main(args: Array[String]): Unit = {
     val l = Cons(KeyValuePair(6, 1), Cons(KeyValuePair(5, 4), Cons(KeyValuePair(3, 2), Nil())))
     val e = 0
diff --git a/testcases/ListWithSize.scala b/testcases/ListWithSize.scala
index a69deb6fb..684dfa806 100644
--- a/testcases/ListWithSize.scala
+++ b/testcases/ListWithSize.scala
@@ -45,35 +45,20 @@ object ListWithSize {
       case Cons(x,xs) => Cons(x, append(xs, l2))
     })
 
-    def nilAppend(l : List) : Boolean = (l match {
-      case Nil() => true
-      case Cons(x,xs) => nilAppend(xs)
-    }) ensuring(res => res && append(l, Nil()) == l)
-
     @induct
-    def nilAppendInductive(l : List) : Boolean = (append(l, Nil()) == l) holds
+    def nilAppend(l : List) : Boolean = (append(l, Nil()) == l) holds
 
     // unclear if we needed this--it was meant to force folding
     def appendFold(x : Int, xs : List, ys : List) : Boolean = {
       true
     } ensuring (res => res && Cons(x,append(xs, ys)) == append(Cons(x,xs), ys))
 
-    def appendAssoc(xs : List, ys : List, zs : List) : Boolean = (xs match {
-      case Nil() => (nilAppendInductive(append(ys,zs)) && nilAppendInductive(ys))
-      case Cons(x,xs1) => appendAssoc(xs1, ys, zs)
-    }) ensuring (res => res && append(xs, append(ys, zs)) == append(append(xs,ys), zs))
-
     @induct
-    def appendAssocInductive(xs : List, ys : List, zs : List) : Boolean =
+    def appendAssoc(xs : List, ys : List, zs : List) : Boolean =
       (append(append(xs, ys), zs) == append(xs, append(ys, zs))) holds
 
-    def sizeAppend(l1 : List, l2 : List) : Boolean = (l1 match {
-      case Nil() => nilAppendInductive(l2)
-      case Cons(x,xs) => sizeAppend(xs, l2)
-    }) ensuring(res => res && size(append(l1,l2)) == size(l1) + size(l2))
-
     @induct
-    def sizeAppendInductive(l1 : List, l2 : List) : Boolean =
+    def sizeAppend(l1 : List, l2 : List) : Boolean =
       (size(append(l1, l2)) == size(l1) + size(l2)) holds
 
     // proved with unrolling=4
-- 
GitLab