From 0947cf84eddfc8d18049a6ae7fdb90f4a7e82c7b Mon Sep 17 00:00:00 2001
From: "Emmanouil (Manos) Koukoutos" <emmanouil.koukoutos@epfl.ch>
Date: Wed, 17 Dec 2014 17:16:59 +0100
Subject: [PATCH] Benchmarks

---
 .../repair/DaysToYears/DaysToYears1.scala     |   2 +-
 .../repair/RedBlackTree/RedBlackTree1.scala   |   6 +-
 .../repair/RedBlackTree/RedBlackTree10.scala  | 143 ------------------
 .../repair/RedBlackTree/RedBlackTree3.scala   |  32 ++--
 ...edBlackTree8.scala => RedBlackTree4.scala} |   0
 .../repair/RedBlackTree/RedBlackTree6.scala   |   2 +-
 .../repair/RedBlackTree/RedBlackTree9.scala   | 143 ------------------
 7 files changed, 20 insertions(+), 308 deletions(-)
 delete mode 100644 testcases/synthesis/repair/RedBlackTree/RedBlackTree10.scala
 rename testcases/synthesis/repair/RedBlackTree/{RedBlackTree8.scala => RedBlackTree4.scala} (100%)
 delete mode 100644 testcases/synthesis/repair/RedBlackTree/RedBlackTree9.scala

diff --git a/testcases/synthesis/repair/DaysToYears/DaysToYears1.scala b/testcases/synthesis/repair/DaysToYears/DaysToYears1.scala
index c8d475de3..13eec09ae 100644
--- a/testcases/synthesis/repair/DaysToYears/DaysToYears1.scala
+++ b/testcases/synthesis/repair/DaysToYears/DaysToYears1.scala
@@ -24,7 +24,7 @@ object DaysToYears {
     (((year,days), res) passes { 
       case (1999, 14 )  => (1999, 14)
       case (1980, 366)  => (1980, 366)
-      case (1981, 634)  => (1982, 269)
+      case (1981, 366)  => (1982, 1)
     })
   } 
 
diff --git a/testcases/synthesis/repair/RedBlackTree/RedBlackTree1.scala b/testcases/synthesis/repair/RedBlackTree/RedBlackTree1.scala
index e705ff4fa..93d5b61e9 100644
--- a/testcases/synthesis/repair/RedBlackTree/RedBlackTree1.scala
+++ b/testcases/synthesis/repair/RedBlackTree/RedBlackTree1.scala
@@ -118,14 +118,14 @@ object RedBlackTree {
       case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
         Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
       case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Red,c,zV,d))  // FIXME: Last Red should be Black
+        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,xV,d))  // FIXME: xV instead of zV in right node
       case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
+        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,xV,d))  // FIXME: xV instead of zV in right node
       case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
         Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
       case Node(c,a,xV,b) => Node(c,a,xV,b)
     }
-  } ensuring (res => content(res) == content(Node(c,a,x,b)) )// && redDescHaveBlackChildren(res))
+  } ensuring (res => content(res) == content(Node(c,a,x,b))) //&& redDescHaveBlackChildren(res))
 
   // def buggyBalance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
   //   Node(c,a,x,b) match {
diff --git a/testcases/synthesis/repair/RedBlackTree/RedBlackTree10.scala b/testcases/synthesis/repair/RedBlackTree/RedBlackTree10.scala
deleted file mode 100644
index 93d5b61e9..000000000
--- a/testcases/synthesis/repair/RedBlackTree/RedBlackTree10.scala
+++ /dev/null
@@ -1,143 +0,0 @@
-import leon._ 
-import lang._
-import annotation._
-
-object RedBlackTree { 
-  sealed abstract class Color
-  case object Red extends Color
-  case object Black extends Color
- 
-  sealed abstract class Tree
-  case object Empty extends Tree
-  case class Node(color: Color, left: Tree, value: Int, right: Tree) extends Tree
-
-  def content(t: Tree) : Set[Int] = t match {
-    case Empty => Set.empty
-    case Node(_, l, v, r) => content(l) ++ Set(v) ++ content(r)
-  }
-
-  def size(t: Tree) : Int = t match {
-    case Empty => 0
-    case Node(_, l, v, r) => size(l) + 1 + size(r)
-  }
-
-  /* We consider leaves to be black by definition */
-  def isBlack(t: Tree) : Boolean = t match {
-    case Empty => true
-    case Node(Black,_,_,_) => true
-    case _ => false
-  }
-
-  def redNodesHaveBlackChildren(t: Tree) : Boolean = t match {
-    case Empty => true
-    case Node(Black, l, _, r) => redNodesHaveBlackChildren(l) && redNodesHaveBlackChildren(r)
-    case Node(Red, l, _, r) => isBlack(l) && isBlack(r) && redNodesHaveBlackChildren(l) && redNodesHaveBlackChildren(r)
-  }
-
-  def redDescHaveBlackChildren(t: Tree) : Boolean = t match {
-    case Empty => true
-    case Node(_,l,_,r) => redNodesHaveBlackChildren(l) && redNodesHaveBlackChildren(r)
-  }
-
-  def blackBalanced(t : Tree) : Boolean = t match {
-    case Node(_,l,_,r) => blackBalanced(l) && blackBalanced(r) && blackHeight(l) == blackHeight(r)
-    case Empty => true
-  }
-
-  def blackHeight(t : Tree) : Int = t match {
-    case Empty => 1
-    case Node(Black, l, _, _) => blackHeight(l) + 1
-    case Node(Red, l, _, _) => blackHeight(l)
-  }
- 
-    
-  // <<insert element x into the tree t>>
-  def ins(x: Int, t: Tree): Tree = {
-    require(redNodesHaveBlackChildren(t) && blackBalanced(t))
-    t match {
-      case Empty => Node(Red,Empty,x,Empty)
-      case Node(c,a,y,b) =>
-        if      (x < y)  balance(c, ins(x, a), y, b)
-        else if (x == y) Node(c,a,y,b)
-        else             balance(c,a,y,ins(x, b))
-    }
-  } ensuring (res => 
-    content(res) == content(t) ++ Set(x) && 
-    size(t) <= size(res) && 
-    size(res) <= size(t) + 1 && 
-    redDescHaveBlackChildren(res) && 
-    blackBalanced(res) 
-  )
-
-  def makeBlack(n: Tree): Tree = {
-    require(redDescHaveBlackChildren(n) && blackBalanced(n) )
-    n match {
-      case Node(Red,l,v,r) => Node(Black,l,v,r)
-      case _ => n
-    }
-  } ensuring(res => redNodesHaveBlackChildren(res) && blackBalanced(res) )
-
-  def add(x: Int, t: Tree): Tree = {
-    require(redNodesHaveBlackChildren(t) && blackBalanced(t) )
-    makeBlack(ins(x, t))
-  } ensuring (res => content(res) == content(t) ++ Set(x) && redNodesHaveBlackChildren(res) && blackBalanced(res) )
-  
-//  def buggyAdd(x: Int, t: Tree): Tree = {
-//    require(redNodesHaveBlackChildren(t))
-//    // makeBlack(ins(x, t))
-//    ins(x, t)
-//  } ensuring (res => content(res) == content(t) ++ Set(x) && redNodesHaveBlackChildren(res))
-  
-  def balance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
-    // require(
-    //   Node(c,a,x,b) match {
-    //     case Node(Black,Node(Red,Node(Red,a,_,b),_,c),_,d) =>
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case Node(Black,Node(Red,a,_,Node(Red,b,_,c)),_,d) =>
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case Node(Black,a,_,Node(Red,Node(Red,b,_,c),_,d)) => 
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case Node(Black,a,_,Node(Red,b,_,Node(Red,c,_,d))) => 
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case t => redDescHaveBlackChildren(t)
-    //   }
-    // )
-    Node(c,a,x,b) match {
-      case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,xV,d))  // FIXME: xV instead of zV in right node
-      case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,xV,d))  // FIXME: xV instead of zV in right node
-      case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(c,a,xV,b) => Node(c,a,xV,b)
-    }
-  } ensuring (res => content(res) == content(Node(c,a,x,b))) //&& redDescHaveBlackChildren(res))
-
-  // def buggyBalance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
-  //   Node(c,a,x,b) match {
-  //     case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //     case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //     case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //     case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //   }
-  // } ensuring (res => content(res) == content(Node(c,a,x,b)) ) // && redDescHaveBlackChildren(res))
-
-}
diff --git a/testcases/synthesis/repair/RedBlackTree/RedBlackTree3.scala b/testcases/synthesis/repair/RedBlackTree/RedBlackTree3.scala
index 8ceec4415..4d8e1f39d 100644
--- a/testcases/synthesis/repair/RedBlackTree/RedBlackTree3.scala
+++ b/testcases/synthesis/repair/RedBlackTree/RedBlackTree3.scala
@@ -88,7 +88,7 @@ object RedBlackTree {
 //    ins(x, t)
 //  } ensuring (res => content(res) == content(t) ++ Set(x) && redNodesHaveBlackChildren(res))
   
-  /*def balance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
+  def balance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
     // require(
     //   Node(c,a,x,b) match {
     //     case Node(Black,Node(Red,Node(Red,a,_,b),_,c),_,d) =>
@@ -118,28 +118,26 @@ object RedBlackTree {
       case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
         Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
       case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
+        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,xV,d))  // FIXME: xV instead of zV in right node
       case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
         Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
       case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
         Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
       case Node(c,a,xV,b) => Node(c,a,xV,b)
     }
-  } ensuring (res => content(res) == content(Node(c,a,x,b)) )// && redDescHaveBlackChildren(res))
-  */
+  } ensuring (res => content(res) == content(Node(c,a,x,b))) //&& redDescHaveBlackChildren(res))
 
-  // FIXME : says buggy, so I uncommented it!
-  def buggyBalance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
-    Node(c,a,x,b) match {
-      case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-    }
-  } ensuring (res => content(res) == content(Node(c,a,x,b)) ) // && redDescHaveBlackChildren(res))
+  // def buggyBalance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
+  //   Node(c,a,x,b) match {
+  //     case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
+  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
+  //     case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
+  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
+  //     case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
+  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
+  //     case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
+  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
+  //   }
+  // } ensuring (res => content(res) == content(Node(c,a,x,b)) ) // && redDescHaveBlackChildren(res))
 
 }
diff --git a/testcases/synthesis/repair/RedBlackTree/RedBlackTree8.scala b/testcases/synthesis/repair/RedBlackTree/RedBlackTree4.scala
similarity index 100%
rename from testcases/synthesis/repair/RedBlackTree/RedBlackTree8.scala
rename to testcases/synthesis/repair/RedBlackTree/RedBlackTree4.scala
diff --git a/testcases/synthesis/repair/RedBlackTree/RedBlackTree6.scala b/testcases/synthesis/repair/RedBlackTree/RedBlackTree6.scala
index eb5dc7248..36cfb692b 100644
--- a/testcases/synthesis/repair/RedBlackTree/RedBlackTree6.scala
+++ b/testcases/synthesis/repair/RedBlackTree/RedBlackTree6.scala
@@ -84,7 +84,7 @@ object RedBlackTree {
  
   def add(x: Int, t: Tree): Tree = {
     require(redNodesHaveBlackChildren(t) && blackBalanced(t) )
-    ins(x, t) // FIX: makeBlack(ins(x, t))
+    ins(x, t) // FIXME: makeBlack(ins(x, t))
   } ensuring (res => content(res) == content(t) ++ Set(x) && redNodesHaveBlackChildren(res) && blackBalanced(res) )
   
   def balance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
diff --git a/testcases/synthesis/repair/RedBlackTree/RedBlackTree9.scala b/testcases/synthesis/repair/RedBlackTree/RedBlackTree9.scala
deleted file mode 100644
index 4d8e1f39d..000000000
--- a/testcases/synthesis/repair/RedBlackTree/RedBlackTree9.scala
+++ /dev/null
@@ -1,143 +0,0 @@
-import leon._ 
-import lang._
-import annotation._
-
-object RedBlackTree { 
-  sealed abstract class Color
-  case object Red extends Color
-  case object Black extends Color
- 
-  sealed abstract class Tree
-  case object Empty extends Tree
-  case class Node(color: Color, left: Tree, value: Int, right: Tree) extends Tree
-
-  def content(t: Tree) : Set[Int] = t match {
-    case Empty => Set.empty
-    case Node(_, l, v, r) => content(l) ++ Set(v) ++ content(r)
-  }
-
-  def size(t: Tree) : Int = t match {
-    case Empty => 0
-    case Node(_, l, v, r) => size(l) + 1 + size(r)
-  }
-
-  /* We consider leaves to be black by definition */
-  def isBlack(t: Tree) : Boolean = t match {
-    case Empty => true
-    case Node(Black,_,_,_) => true
-    case _ => false
-  }
-
-  def redNodesHaveBlackChildren(t: Tree) : Boolean = t match {
-    case Empty => true
-    case Node(Black, l, _, r) => redNodesHaveBlackChildren(l) && redNodesHaveBlackChildren(r)
-    case Node(Red, l, _, r) => isBlack(l) && isBlack(r) && redNodesHaveBlackChildren(l) && redNodesHaveBlackChildren(r)
-  }
-
-  def redDescHaveBlackChildren(t: Tree) : Boolean = t match {
-    case Empty => true
-    case Node(_,l,_,r) => redNodesHaveBlackChildren(l) && redNodesHaveBlackChildren(r)
-  }
-
-  def blackBalanced(t : Tree) : Boolean = t match {
-    case Node(_,l,_,r) => blackBalanced(l) && blackBalanced(r) && blackHeight(l) == blackHeight(r)
-    case Empty => true
-  }
-
-  def blackHeight(t : Tree) : Int = t match {
-    case Empty => 1
-    case Node(Black, l, _, _) => blackHeight(l) + 1
-    case Node(Red, l, _, _) => blackHeight(l)
-  }
- 
-    
-  // <<insert element x into the tree t>>
-  def ins(x: Int, t: Tree): Tree = {
-    require(redNodesHaveBlackChildren(t) && blackBalanced(t))
-    t match {
-      case Empty => Node(Red,Empty,x,Empty)
-      case Node(c,a,y,b) =>
-        if      (x < y)  balance(c, ins(x, a), y, b)
-        else if (x == y) Node(c,a,y,b)
-        else             balance(c,a,y,ins(x, b))
-    }
-  } ensuring (res => 
-    content(res) == content(t) ++ Set(x) && 
-    size(t) <= size(res) && 
-    size(res) <= size(t) + 1 && 
-    redDescHaveBlackChildren(res) && 
-    blackBalanced(res) 
-  )
-
-  def makeBlack(n: Tree): Tree = {
-    require(redDescHaveBlackChildren(n) && blackBalanced(n) )
-    n match {
-      case Node(Red,l,v,r) => Node(Black,l,v,r)
-      case _ => n
-    }
-  } ensuring(res => redNodesHaveBlackChildren(res) && blackBalanced(res) )
-
-  def add(x: Int, t: Tree): Tree = {
-    require(redNodesHaveBlackChildren(t) && blackBalanced(t) )
-    makeBlack(ins(x, t))
-  } ensuring (res => content(res) == content(t) ++ Set(x) && redNodesHaveBlackChildren(res) && blackBalanced(res) )
-  
-//  def buggyAdd(x: Int, t: Tree): Tree = {
-//    require(redNodesHaveBlackChildren(t))
-//    // makeBlack(ins(x, t))
-//    ins(x, t)
-//  } ensuring (res => content(res) == content(t) ++ Set(x) && redNodesHaveBlackChildren(res))
-  
-  def balance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
-    // require(
-    //   Node(c,a,x,b) match {
-    //     case Node(Black,Node(Red,Node(Red,a,_,b),_,c),_,d) =>
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case Node(Black,Node(Red,a,_,Node(Red,b,_,c)),_,d) =>
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case Node(Black,a,_,Node(Red,Node(Red,b,_,c),_,d)) => 
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case Node(Black,a,_,Node(Red,b,_,Node(Red,c,_,d))) => 
-    //       redNodesHaveBlackChildren(a) &&
-    //       redNodesHaveBlackChildren(b) &&
-    //       redNodesHaveBlackChildren(c) &&
-    //       redNodesHaveBlackChildren(d)
-    //     case t => redDescHaveBlackChildren(t)
-    //   }
-    // )
-    Node(c,a,x,b) match {
-      case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,xV,d))  // FIXME: xV instead of zV in right node
-      case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
-        Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-      case Node(c,a,xV,b) => Node(c,a,xV,b)
-    }
-  } ensuring (res => content(res) == content(Node(c,a,x,b))) //&& redDescHaveBlackChildren(res))
-
-  // def buggyBalance(c: Color, a: Tree, x: Int, b: Tree): Tree = {
-  //   Node(c,a,x,b) match {
-  //     case Node(Black,Node(Red,Node(Red,a,xV,b),yV,c),zV,d) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //     case Node(Black,Node(Red,a,xV,Node(Red,b,yV,c)),zV,d) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //     case Node(Black,a,xV,Node(Red,Node(Red,b,yV,c),zV,d)) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //     case Node(Black,a,xV,Node(Red,b,yV,Node(Red,c,zV,d))) => 
-  //       Node(Red,Node(Black,a,xV,b),yV,Node(Black,c,zV,d))
-  //   }
-  // } ensuring (res => content(res) == content(Node(c,a,x,b)) ) // && redDescHaveBlackChildren(res))
-
-}
-- 
GitLab