From 6810bfa04d59495d5f9accd6fd8a5cdf4a1faea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ali=20Sinan=20K=C3=B6ksal?= <alisinan@gmail.com> Date: Tue, 8 Nov 2011 05:04:47 +0000 Subject: [PATCH] An attempt to have declarative RBT operations in Curry --- curry-testcases/RBT.curry | 45 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 curry-testcases/RBT.curry diff --git a/curry-testcases/RBT.curry b/curry-testcases/RBT.curry new file mode 100644 index 000000000..d01be478a --- /dev/null +++ b/curry-testcases/RBT.curry @@ -0,0 +1,45 @@ +module RBT + (Tree, size, isRBT + ) where + +--- The colors of a node in a red-black tree. +data Color = Red | Black + +--- The structure of red-black trees. +data Tree = Node Color Int Tree Tree + | Empty + +max :: Int -> Int -> Int +max a b = if (a > b) then a else b + +size :: Tree -> Int +size Empty = 0 +size (Node _ _ l r) = 1 + (size l) + (size r) + +isBlack :: Tree -> Bool +isBlack Empty = True +isBlack (Node c _ _ _) = c==Black + +redNodesHaveBlackChildren :: Tree -> Bool +redNodesHaveBlackChildren Empty = True +redNodesHaveBlackChildren (Node Black _ l r) = + (redNodesHaveBlackChildren l) && (redNodesHaveBlackChildren r) +redNodesHaveBlackChildren (Node Red _ l r) = + (isBlack l) && (isBlack r) && (redNodesHaveBlackChildren l) && (redNodesHaveBlackChildren r) + +blackBalanced :: Tree -> Bool +blackBalanced Empty = True +blackBalanced (Node _ _ l r) = + (blackBalanced l) && (blackBalanced r) && (blackHeight l == blackHeight r) + +blackHeight :: Tree -> Int +blackHeight Empty = 0 +blackHeight (Node Black _ l _) = 1 + (blackHeight l) +blackHeight (Node Red _ l _) = blackHeight l + +isRBT :: Tree -> Bool +isRBT t = (blackBalanced t) && (redNodesHaveBlackChildren t) + +valuesWithin :: Tree -> Int -> Bool +valuesWithin Empty _ = True +valuesWithin (Node _ v l r) bound = 0 <= v && v <= bound && (valuesWithin l bound) && (valuesWithin r bound) -- GitLab