The fundamental concepts of rule-based programming are present in many areas of computer science, from theory to practical implementations. In programming languages, term rewriting is used in semantics as well as in implementations that use bottom-up rewriting for code generation. Rules are also used to perform computations in various systems; to describe logical inference in theorem provers; to specify and implement constraint-based algorithms and applications; and to describe and implement program transformations. Rule-based programming provides a common framework for viewing computation as a sequence of transformations on some shared structure such as a term, graph, proof, or constraint store. Rule selection and application is typically governed by a rich set of sophisticated mechanisms for recognizing and manipulating structures.