From 294b1b9fc2b0a846a898832c23f3c21ed9b1168b Mon Sep 17 00:00:00 2001 From: Swen Jacobs <swen.jacobs@epfl.ch> Date: Mon, 12 Jul 2010 09:58:41 +0000 Subject: [PATCH] added sortedness for insert in BinaryTree --- testcases/BinarySearchTree.scala | 84 ++++++++++++++++---------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/testcases/BinarySearchTree.scala b/testcases/BinarySearchTree.scala index 463ae6c02..9b8dbc159 100644 --- a/testcases/BinarySearchTree.scala +++ b/testcases/BinarySearchTree.scala @@ -14,48 +14,48 @@ object BinarySearchTree { sealed abstract class Triple case class SortedTriple(min: Option, max: Option, sorted: Boolean) extends Triple - /* - def isSorted(tree: Tree): SortedTriple = tree match { - case Leaf() => SortedTriple(None(), None(), true) - case Node(l,v,r) => sorted(l) match { - case SortedTriple(minl,maxl,false) => SortedTriple(None(), None(), false) - case SortedTriple(minl, maxl, _) => minl match { - case None() => maxl match { - case None() => sorted(r) match { - case SortedTriple(_,_,false) => SortedTriple(None(), None(), false) - case SortedTriple(minr,maxr,_) => minr match { - case None() => maxr match { - case None() => SortedTriple(Some(v),Some(v),true) - case _ => SortedTriple(None(),None(),false) - } - case Some(minrv) => maxr match { - case Some(maxrv) => if (minrv > v) SortedTriple(Some(v),Some(maxrv),true) else SortedTriple(None(),None(),false) - case _ => SortedTriple(None(),None(),false) - } + + def isSorted(tree: Tree): SortedTriple = tree match { + case Leaf() => SortedTriple(None(), None(), true) + case Node(l,v,r) => isSorted(l) match { + case SortedTriple(minl,maxl,sortl) => if (!sortl) SortedTriple(None(), None(), false) + else minl match { + case None() => maxl match { + case None() => isSorted(r) match { + case SortedTriple(minr,maxr,sortr) => if (!sortr) SortedTriple(None(), None(), false) + else minr match { + case None() => maxr match { + case None() => SortedTriple(Some(v),Some(v),true) + case Some(maxrv) => SortedTriple(None(),None(),false) + } + case Some(minrv) => maxr match { + case Some(maxrv) => if (minrv > v) SortedTriple(Some(v),Some(maxrv),true) else SortedTriple(None(),None(),false) + case None() => SortedTriple(None(),None(),false) + } + } + } + case Some(maxlv) => SortedTriple(None(),None(),false) + } + case Some(minlv) => maxl match { + case Some(maxlv) => isSorted(r) match { + case SortedTriple(minr,maxr,sortr) => if (!sortr) SortedTriple(None(), None(), false) + else minr match { + case None() => maxr match { + case None() => if (maxlv <= v) SortedTriple(Some(minlv),Some(v),true) else SortedTriple(None(),None(),false) + case Some(maxrv) => SortedTriple(None(),None(),false) + } + case Some(minrv) => maxr match { + case Some(maxrv) => if (maxlv <= v && minrv > v) SortedTriple(Some(minlv),Some(maxrv),true) else SortedTriple(None(),None(),false) + case None() => SortedTriple(None(),None(),false) + } + } + } + case None() => SortedTriple(None(),None(),false) + } + } } - } - case _ => SortedTriple(None(),None(),false) } - case Some(minlv) => maxl match { - case Some(maxlv) => sorted(r) match { - case SortedTriple(_,_,false) => SortedTriple(None(), None(), false) - case SortedTriple(minr,maxr,_) => minr match { - case None() => maxr match { - case None() => if (maxlv <= v) SortedTriple(Some(minlv),Some(v),true) else SortedTriple(None(),None(),false) - case _ => SortedTriple(None(),None(),false) - } - case Some(minrv) => maxr match { - case Some(maxrv) => if (maxlv <= v && minrv > v) SortedTriple(Some(minlv),Some(maxrv),true) else SortedTriple(None(),None(),false) - case _ => SortedTriple(None(),None(),false) - } - } - } - case _ => SortedTriple(None(),None(),false) - } - } - } - } - */ + def treeMin(tree: Node): Int = tree match { case Node(left, v, _) => left match { @@ -75,7 +75,7 @@ object BinarySearchTree { } //ensuring (_ == contents(tree).max) def insert(tree: Tree, value: Int): Node = { - //require(isSorted(tree)) + require(isSorted(tree).sorted) tree match { case Leaf() => Node(Leaf(), value, Leaf()) case n@Node(l, v, r) => if (v < value) { @@ -86,7 +86,7 @@ object BinarySearchTree { n } } - } ensuring (contents(_) == contents(tree) ++ Set(value)) + } ensuring (res => contents(res) == contents(tree) ++ Set(value) && isSorted(res).sorted) def dumbInsert(tree: Tree): Node = { tree match { -- GitLab