A reformulation of a mathematical program is a formulation which
shares some properties with, but is in some sense better than, the
original program. Reformulations are important with respect to the
choice and efficiency of the solution algorithms; furthermore, it is
desirable that reformulations can be carried out
automatically. Reformulation techniques are widespread in mathematical
programming but interestingly they have never been studied under a
unified framework. This paper attempts to move some steps in this
direction. We define a framework for storing and manipulating
mathematical programming formulations and give several fundamental
definitions categorizing useful reformulations in essentially four
types (opt-reformulations, narrowings, relaxations and
approximations). We establish some theoretical results and give
reformulation examples for each type.