As we progress through this book, we shall encounter a number of important** unifying principles**. We alert the reader to two of these here: 1. **Design algebras.** In certain fields in which the underlying models have become well understood, we can develop notations in which design trade-offs can be expressed and evaluated. Through this understanding, we *can develop a theory of design* with which well-engineered systems can be constructed. Propositional logic, with the associated notation called **Boolean algebra** .

With it, we can design **efficient circuits** for subsystems of the kind found in digital computers. Other examples of *algebras* found in this book are the algebra of sets in *Chapter 7, the algebra of relations in Chapter 8, and the algebra of regular expressions in Chapter 10. *

**COMPUTER SCIENCE: THE MECHANIZATION OF ABSTRACTION** 2. *Recursion* is such a useful technique for defining concepts and solving problems that it deserves special mention. We discuss recursion in detail in Chapter 2 and use it throughout the rest of the book. Whenever we need to define an object precisely or whenever we need to solve a problem, we should always ask, *“What does the recursive solution look like?”* Frequently that solution has a simplicity and efficiency that makes it the method of choice.