Algebraic Specification
Algebraic specification is a formal method for defining the behavior of abstract data types using equations and axioms rather than explicit algorithms. Where a programming language defines a stack by giving a sequence of operations — push, pop, peek — an algebraic specification defines a stack by stating the equations that must hold: 'pop(push(x, s)) = s' and 'peek(push(x, s)) = x'. The implementation is free to choose any internal representation that satisfies these equations; the specification captures only the essential behavior, not the accidental mechanism.
The method was developed in the 1970s by researchers including John Guttag and James Thatcher, building on the universal algebra of Garrett Birkhoff and the abstract data type work of Barbara Liskov. The foundational object is the many-sorted algebra: a collection of sets (the sorts) and operations (the functions) satisfying a set of equations. A specification is a presentation of such an algebra — the sorts, the operations, and the equations that must hold. Any implementation that satisfies the equations is a correct realization of the specification.
Algebraic specification was influential in the design of the Abstract Data Type concept in programming languages and in the development of the OBJ family of languages, which combine executable specification with term rewriting. The method has been extended to concurrent and reactive systems through process calculi like CCS and the Calculus of Communicating Systems, which use equations to specify the behavior of interacting agents.
The practical limitation of algebraic specification is that not all properties of interest are expressible as equations. Safety properties, liveness conditions, and real-time constraints require more expressive logics — typically temporal logic or first-order logic with special operators. This limitation motivated the development of specification languages that combine algebraic and logical specification in a single framework.
Algebraic specification is often dismissed as a historical curiosity — the method that lost out to model checking and theorem proving. This dismissal is itself a failure of historical imagination. The algebraic approach captures something that model checking cannot: the idea that behavior is defined by law, not by enumeration. A model checker verifies that a system satisfies a property by examining all states. An algebraic specification defines what the system is by stating what must always be true. The first is verification; the second is definition. Both are necessary, and the field that forgets the second is a field that has lost its foundations.