  Rewriting logic is a natural and expressive framework for the specification
of concurrent systems and logics. The Maude specification language provides an
implementation of this formalism that allows executing, verifying, and
analyzing the represented systems. These specifications declare their objects
by means of terms and equations, and provide rewriting rules to represent
potentially non-deterministic local transformations on the state. Sometimes a
controlled application of these rules is required to reduce non-determinism, to
capture global, goal-oriented or efficiency concerns, or to select specific
executions for their analysis. That is what we call a strategy. In order to
express them, respecting the separation of concerns principle, a Maude strategy
language was proposed and developed. The first implementation of the strategy
language was done in Maude itself using its reflective features. After ample
experimentation, some more features have been added and, for greater
efficiency, the strategy language has been implemented in C++ as an integral
part of the Maude system.
  This paper describes the Maude strategy language along with its semantics,
its implementation decisions, and several application examples from various
fields.
