The so called “cogen approach” to program
specialisation, writing a compiler generator instead of a
specialiser, has been used with considerable success in partial
evaluation of both functional and imperative languages. This paper
demonstrates that the cogen approach is also
applicable to the specialisation of logic programs (called partial
deduction) and leads to effective specialisers. Moreover, using good
binding-time annotations, the speed-ups of the specialised programs
are comparable to the speed-ups obtained with online specialisers.
The paper first develops a generic approach to offline partial
deduction and then a specific offline partial deduction method,
leading to the offline system LIX for pure logic programs.
While this is a usable specialiser by itself, it is used to develop
the cogen system LOGEN. Given a program, a
specification of what inputs will be static, and an annotation
specifying which calls should be unfolded, LOGEN generates
a specialised specialiser for the program at hand. Running this
specialiser with particular values for the static inputs results in
the specialised program. While this requires two steps instead of
one, the efficiency of the specialisation process is improved in
situations where the same program is specialised multiple times. The
paper also presents and evaluates an automatic binding-time analysis
that is able to derive the annotations. While the derived
annotations are still suboptimal compared to hand-crafted ones, they
enable non-expert users to use the LOGEN system in a fully
automated way. Finally, LOGEN is extended so as to directly
support a large part of Prolog's declarative and non-declarative
features and so as to be able to perform so called mixline
specialisations.