From 053d9f0b0acb67351683e5b4f8f1b7b0efb01b60 Mon Sep 17 00:00:00 2001
From: Viktor Kuncak <vkuncak@gmail.com>
Date: Tue, 16 Nov 2010 09:54:35 +0000
Subject: [PATCH] nilAppend works

---
 testcases/ListWithSize.scala | 41 ++++++++++++++++++------------------
 1 file changed, 20 insertions(+), 21 deletions(-)

diff --git a/testcases/ListWithSize.scala b/testcases/ListWithSize.scala
index bbef62f72..1d155bcd3 100644
--- a/testcases/ListWithSize.scala
+++ b/testcases/ListWithSize.scala
@@ -44,30 +44,29 @@ object ListWithSize {
       case Cons(x,xs) => Cons(x, append(xs, l2))
     })
 
-//    @induct
-    def propAppend1(l : List) : Boolean = {
-      append(l, Nil()) == l
-    } ensuring(_ == true)
-    // should generate something like:
-    def propAppend2(l : List) : Boolean = (l match {
-      case Nil() => propAppend1(l)
-      case Cons(x,xs) => (!propAppend1(xs) || propAppend1(l))
-    }) ensuring (_ == true)
+    def nilAppend(l : List) : Boolean = (l match {
+      case Nil() => true
+      case Cons(x,xs) => nilAppend(xs)
+    }) ensuring(_ => append(Nil(), l) == l)
 
-    def propAppend3(l : List) : Boolean = {
-      !propAppend1(l) || propAppend2(l)
-    } ensuring (_ == true)
+    def appendFold(x : Int, xs : List, ys : List) : Boolean = {
+      true
+    } ensuring (_ => Cons(x,append(xs, ys)) == append(Cons(x,xs), ys))
 
-//    def twoLists(l1 : List) : Boolean = {
-//      Forall((l2 : List) => size(append(l1,l2)) = size(l1) + size(l2))
-//    }
+  // did not work for Viktor / 16 Nov 2010
+    def appendAssoc(xs : List, ys : List, zs : List) : Boolean = (xs match {
+      case Nil() => (nilAppend(append(ys,zs)) && nilAppend(ys))
+      case Cons(x,xs1) => (appendAssoc(xs1, ys, zs) &&
+                           appendFold(x, ys,zs) &&
+			   appendFold(x, append(xs,ys), zs) &&
+			   appendFold(x, xs,ys))
+    }) ensuring (_ => append(xs, append(ys, zs)) == append(append(xs,ys), zs))
 
-/*
-    def induct(l : List, prop : List => Boolean) = {
-      case Nil() => prop(l)
-      case Cons(x,xs) => (!prop(xs) || prop(l))
-    }
-*/
+  // did not work for Viktor / 16 Nov 2010
+    def twoLists(l1 : List, l2 : List) : Boolean = (l1 match {
+      case Nil() => nilAppend(l2)
+      case Cons(x,xs) => twoLists(xs, l2)
+    }) ensuring(_ => size(append(l1,l2)) == size(l1) + size(l2))
 
     // proved with unrolling=4
     def concat(l1: List, l2: List) : List = concat0(l1, l2, Nil()) 
-- 
GitLab