| inductive Color where | |
| | Red | |
| | Black | |
| open Color | |
| inductive rbnode : Nat → Color → Type where | |
| | Leaf : rbnode 1 Black | |
| | R {h} | |
| (left : rbnode h Black) | |
| (value : Int) | |
| (right : rbnode h Black) : rbnode h Red | |
| | B {h cl cr} | |
| (left : rbnode h cl) | |
| (value : Int) | |
| (right : rbnode h cr) : rbnode (h+1) Black | |
| open rbnode | |
| inductive hiddenTree : Nat → Type | |
| | HR {h} (node : rbnode h Red) : hiddenTree h | |
| | HB {h} (node : rbnode (h+1) Black) : hiddenTree (h+1) | |
| open hiddenTree | |
| inductive almostNode : Nat → Type | |
| | LR {h cR} (left:rbnode h Red) (value:Int) (right:rbnode h cR) : almostNode h | |
| | RR {h cL} (left:rbnode h cL) (value:Int) (right:rbnode h Red) : almostNode h | |
| | V {h c} (node:rbnode h c) : almostNode h | |
| open almostNode | |
| def balanceRR {h c} (left : rbnode h c) (y : Int) (right : hiddenTree h) : almostNode h := | |
| match h, c, left, right with | |
| | _, _, left, HR c => RR left y c | |
| | n+1, _, R a x b, HB c => LR (R a x b) y c | |
| | _, _, B a x b, HB c => V (R (B a x b) y c) | |
| | _, _, Leaf, HB c => V (R Leaf y c) |