This paper describes a language for constructing problem-solving programs. The language can manipulate several data structures, including ordered and unordered sets. Pattern matching facilities may be used in various ways, including the binding of variables. Implicit backtracking facilitates the compact representation of search procedures. Expressions are treated analogously to atoms in LISP. A “context” device is used to implement variable bindings, to effect conditional proofs, and to solve the “frame” problem in robot planning.