generic
    type Tree is private;
    Null_Tree : in Tree;
    with function Is_Null (The_Tree : in Tree) return Boolean;
    with function Number_Of_Children_In (The_Tree : in Tree) return Natural;
    with function Child_Of
                     (The_Tree : in Tree; The_Child : in Positive) return Tree;
    with function Parent_Of (The_Tree : in Tree) return Tree;
package Tree_Utilities_Arbitrary_Double is

    function Is_Root (The_Tree : in Tree) return Boolean;
    function Is_Leaf (The_Tree : in Tree) return Boolean;
    function Root_Of (The_Tree : in Tree) return Tree;
    function Child_Name_Of (The_Tree : in Tree) return Positive;
    function Number_Of_Siblings_Of (The_Tree : in Tree) return Natural;
    function Left_Sibling_Of (The_Tree : in Tree) return Tree;
    function Right_Sibling_Of (The_Tree : in Tree) return Tree;
    function Leftmost_Sibling_Of (The_Tree : in Tree) return Tree;
    function Rightmost_Sibling_Of (The_Tree : in Tree) return Tree;

    Tree_Is_Root : exception;

end Tree_Utilities_Arbitrary_Double;