relabelAt :: Label -> ExprTree a -> ExprTree a
-- ^ relabels a tree startin on a given level
relabelAt init (Node l fun lb rb) = Node init fun
                                   (relabelAt (init - (1 % (2 * d))) lb)
                                   (relabelAt (init + (1 % (2 * d))) rb)
                                  where d = denominator init
relabelAt :: Label -> ExprTree a -> ExprTree a
relabelAt init (Node l fun lb rb) = Node init fun
                                   (relabelAt (init - (1 % (2 * d))) lb)
                                   (relabelAt (init + (1 % (2 * d))) rb)
                                  where d = denominator init
relabelAt init (Node l fun lb rb) = Node init fun
                                   (relabelAt (init - (1 % (2 * d))) lb)
                                   (relabelAt (init + (1 % (2 * d))) rb)
                                  where d = denominator init