Logic programming is a rule-based formalism: a program consists of a set of rules activated by an initial query. In contrast, imperative programming is explained by means of a procedure-based view: a program consists of a set of procedure declarations and an initial statement.

We clarify here to what procedure-based formalism logic programming corresponds. To this end we introduce a procedure-based view based on a subset of first-order logic and assign to it an operational semantics. We establish two results. First, we show that a syntactic transformation that forms part of Clark’s completion of a logic program provides a translation from the rule-based view to the procedure-based view. Second, we show that the transformations in the spirit of Lloyd-Topor provide a translation from the procedure-based view to the rule-based view.

Finally, we discuss the consequences of adoption of each view for the design of logic programming languages.