This statement, written by the organizers, was included with the invitations to participants.

**Generic programming** is a sub-discipline of computer science that deals
with finding abstract representations of efficient algorithms, data
structures, and other software concepts, and with their systematic
organization. The goal of generic programming is to express algorithms
and data structures in a broadly adaptable, interoperable form that
allows their direct use in software construction. Key ideas include:

- Expressing algorithms with minimal assumptions about data abstractions, and vice versa, thus making them as interoperable as possible.
- Lifting of a concrete algorithm to as general a level as possible without losing efficiency; i.e., the most abstract form such that when specialized back to the concrete case the result is just as efficient as the original algorithm.
- When the result of lifting is not general enough to cover all uses of an algorithm, additionally providing a more general form, but ensuring that the most efficient specialized form is automatically chosen when applicable.
- Providing more than one generic algorithm for the same purpose and at the same level of abstraction, when none dominates the others in efficiency for all inputs. This introduces the necessity to provide sufficiently precise characterizations of the domain for which each algorithm is the most efficient.

The intention in this seminar is to focus on generic programming techniques that can be used in practice, rather than to discuss purely theoretical issues. By the end of the seminar we would like to come up with the following results:

- A list of problems in generic programming. These include new components, new kinds of abstractions, language extensions, tools.
- A process for extending the existing body of generic components, as well as methods for their specification and verification and for establishing their efficiency in actual programs.