9402486 Lieberherr This project would study the engineering of adaptive software that adapts without modification to a wide range of requirement changes and that can be reused in unplanned ways. Adaptive programming is at a higher level of abstraction than object-oriented programming. The key idea is that each adaptive program specifies a family of object-oriented programs. Adaptive software subsumes previously developed concepts of class dictionaries and propagation patterns. Adaptive software has two parts: a data part and a functional part. These two parts are loosely coupled through constraints, allowing the same functional part to wopk with different data parts and the same data part to be matched with different functional parts. The loose coupling yields adaptiveness and allows high-level structuring and reasoning about software. To further understand and facilitate the engineering of adaptive software, this project would study the following topics: (1) Type systems for adaptive software, enabling safety checking at the level of adaptive programs; (2) Reengineering algorithms which abstract higher-level structures from lower-level structures, extending our previous work on abstracting class dictionary graphs from objects and propagation patterns from call graphs; (3) Analysis of adaptive software, addressing resource consumption (such as time and space) at the level of adaptive software; (4) Visual programming, as motivated by the use of graph specifications in adaptive software; (5) Experiments with building an adaptive software library and associated tools. ***