What is an abstraction? A dictionary definition of "to abstract" is "to consider apart from application to or association with a particular instance" (Merriam-Webster's Collegiate Dictionary, Tenth Edition). For purposes of this document, I will define an abstraction as a set of labeled sets, where the labels are called sorts, and a set of labeled operations on the sets, where the operations have a specified arity, which is a list of specified sorts of the operation's inputs and outputs. This is in fact only a mild generalization of the way a data abstraction (a.k.a. a data type or simply a type) is often defined in computer science, but actually the definition is broad enough to capture also a notion of algorithms and other fundamental computer science terms. An algorithm, for example, is an abstraction in which there is only one operation (the algorithm) in the set of operations and the set of objects is empty. I believe that the computer science definition can also be usefully applied to other non-computational domains, but in this document we will not attempt to demonstrate that.
Requirements on abstractions are of two kinds: interfaces and properties.