  A major determinant of the quality of software systems is the quality of
their requirements, which should be both understandable and precise. Most
requirements are written in natural language, good for understandability but
lacking in precision. To make requirements precise, researchers have for years
advocated the use of mathematics-based notations and methods, known as
"formal". Many exist, differing in their style, scope and applicability. The
present survey discusses some of the main formal approaches and compares them
to informal methods. The analysis uses a set of 9 complementary criteria, such
as level of abstraction, tool availability, traceability support. It classifies
the approaches into five categories: general-purpose, natural-language,
graph/automata, other mathematical notations, seamless
(programming-language-based). It presents approaches in all of these
categories, altogether 22 different ones, including for example SysML, Relax,
Eiffel, Event-B, Alloy. The review discusses a number of open questions,
including seamlessness, the role of tools and education, and how to make
industrial applications benefit more from the contributions of formal
approaches.
  (This is the full version of the survey, including some sections and two
appendices which, because of length restrictions, do not appear in the
submitted version.)
