An operation often performed by optimizing compilers for higher-level languages is common - subexpression elimination. Traditionally, common - subexpression elimination is performed on a directed, acyclic graph representing the expression or program. This paper shows how common - subexpression elimination can be expressed algebraically, using a "program algebra" incorporating the syntax of typical higher-level language expressions plus l-expressions from the l calculus and functional programming. This approach has two major advantage - it is intuitive and easy to understand and it uses transformations for which correctness-preservation is easy to prove. (pp. 397-408)