The primary motivation in developing DLP was to provide an environment suited for implementing distributed knowledge-based systems, such as expert systems and systems for distributed problem solving. Questions arising with respect to the design of a language that supports distributed knowledge processing are to what extent the language needs to be declarative, how parallelism is incorporated and what constructs are provided for the representation of knowledge.

Declarative languages

It is widely recognized that, for modeling a domain of expertise or problem solving, preference should be given to a declarative language for knowledge representation. C.f.  [ABW87],  [WO84]. Nevertheless, although we have clearly stated such a preference by taking Horn clause logic as a base language for DLP, it is our (strongly held) opinion that a mere declarative language does not provide sufficient means to control search and inference to the extent necessary for building systems with non-trivial functionality. C.f.  [Ha85]. Partly, this control can be effected by relying on a standard way of evaluation, such as the left-to-right evaluation of Prolog goals, or by defining a strategy adequate for the problem at hand as described in  [WO84]. A language such as Prolog, however, allows more drastic means for effecting control, notably by means of the cut and the assert and retract statements, the use of which is justifiably frowned upon by those taking a strictly declarative stand. See also  [Bo84],  [Me82],  [Ra74],  [Go84],  [Pada88].

Parallelism

When thinking about parallelism the ideological gap between a pragmatic approach and what is theoretically justifiable inevitably seems to widen. Serious difficulty in exploiting the parallelism inherent in the computation model of logic programming languages has been caused by the need to restrict the number of processes created for evaluating a goal, and to avoid excessive communication between processes. Cf.  [Co87]. Moreover, for reasons of synchronisation several ad hoc solutions have been proposed, such as the wait statement in Parlog, and the annotated variable in Concurrent Prolog. Cf.  [Ra86]. Rather than adhering to some established conception of concurrent logic programming (cf.  [Ri88]), we have decided to investigate what, to our mind, is needed for distributed problem solving, and more specifically for distributed logic programming. See also  [ELF82],  [Fa85],  [LO84],  [HA84],  [HH86],  [LH85],  [Mo81],  [Mo84].

Knowledge representation

With respect to issues of knowledge representation we have taken the stand that, although we wish to support a declarative language, we also wish to provide a programmer with sufficient means for programming a suitable solution, even if this would mean leaving the declarative realm. For efficiently exploiting parallelism, this seems unavoidable; for knowledge representation, although not unavoidable, the provision of non-declarative constructs inspired by the paradigm of object oriented programming simply means following a trend, that is giving in to the need expressed by programmers in the field of knowledge-based systems. C.f.  [AN86],  [HL89],  [Ki89],  [Tello89],  [OY85]. \nop{ It has been argued that the introduction of object oriented constructs removes one of the major weaknesses of logic programming: its lack of structure. The paradigm of object oriented programming, indeed, has proven to be very useful as a guiding principle for programming in the large. Object oriented programming allows to shift the focus from procedures that manipulate data to the data that represent the problem at hand. Data are encapsulated by objects, for which an interface must be defined to govern the communication with other objects. The obvious advantage is a clear separation between specification and implementation, which allows for rapid prototyping and reusing code, and moreover facilitates the maintainance and modification of a program. Objects provide more protection than modules, since the discipline of object oriented programming enforces to specify how communication takes place between objects. Another important contribution of object oriented programming has been the use of inheritance, in defining objects that are almost alike, or more generally speaking in specifying the relations between objects. }