The algebraic specification of abstract data types
An axiomatic basis for computer programming