Conventionally, distributed applications are composed of statically-partitioned client-server modules which communicate using fixed, pre-defined APIs. There is no distinction between mechanism and policy: the function implemented by a module and the policy specifying the role of the module in the overall logic of the application are inextricably intertwined in the code of every module. Therefore, it is often difficult to adapt such distributed applications by replacing its constituent components, or to even reuse a component for satisfying a different goal.

Goal-oriented programming in a pervasive computing environment, on the other hand, involves dynamic assembly, and subsequent re-restructuring, of available distributed components. Therefore, individual components must be reusable for implementing a variety of high-level goals, while the policy for specifying the use of different components must be abstracted away in a process capable of planning the assembly and, subsequent adaptation, of distributed components to accomplish and sustain a high-level goal in the changing characteristics of a pervasive computing environment.

Our goal is to provide a platform-independent substrate that allows a set of software modules to be selected from a repertoire, deployed on various hosts, and interconnected to implement some application-level service. We would like this system to allow hot swapping of code modules to upgrade service, as well as controlled but independent evolution of individual code modules (pebbles).

Pebbles connection graph


The pebbles distributed computing platform provides support for discovering generic components, deploying components at various hosts, and interconnecting components to dynamically compose and adapt application-level services.

The API presented by our component model is designed to hide certain complexities of a highly parallel, distributed system of interconnected components under the veneer of a simple, sequential, and localized system. Although our design is motivated by the implementation needs of our goal-oriented planning layer, the pebbles-based computation layer is designed to be usable by (and of potential interest to) those following more conventional approaches to distributed application design.

The basic API provides a mechanism for instantiating a collection of pebbles on various hosts, interconnecting them into a network, and monitoring the operation of the resulting composite via a stream of high-level events generated by the pebbles and connections. Events are used to report component failures, user inputs, or various pebble-specific notifications. The intent is to minimize the tedium of developing and maintaining distributed applications, allowing a high-level application to focus on a simple sequential model for its cognitive deliberations, while the compute-intensive reflexive components are managed largely automatically.


The current version of Pebbles implemented in Python. We have experimented with a range of applications using this system, including a voice-driven walkie-talkie application, a voice-input command interpreter (voice shell) and a distributed MP3 player.


Our current efforts are focused on integrating the pebbles system with the Goals system to leverage goal-oriented programming.

Longer-term implementation plans involve support for compilation during the installation process. Using this approach, instances of pebbles can be compiled to exploit instance-specific peculiarities; for example, connected pebbles within the same host might be recompiled to intercommunicate directly and to share data structures.