generic type Item is private; package Stacks is type Stack( Capacity: Positive ) is limited private; function Size( S: Stack ) return Natural; procedure Empty( S: in out Stack ); procedure Push( S: in out Stack; I: in Item ); -- PRE: Size(S) < S.Capacity -- POST: Size(S) > 0 and Top(S) = I procedure Pop( S: in out Stack ); -- PRE: Size(S) > 0 -- POST: Size(S) < S.Capacity function Top( S: Stack ) return Item; -- PRE: Size(S) > 0 private type Item_Array is array( Positive range <> ) of Item; type Stack( Capacity: Positive ) is record Size: Natural := 0; Data: Item_Array(1..Capacity); end record; end Stacks;