In this context, the following, though rather old, is highly readable:
"Higher-order logic programming in Prolog" (Lee Naish) (1996)
"Functional programmers have shown the outstanding beneﬁts of the higher order style of programming. It is ubiquitous in modern functional programming languages. It enables greater code reuse, encourages more abstraction and alleviates the tedium of writing many similar long-winded recursive deﬁnitions. Over the years many people have also toyed with this style of programming in Prolog but to say it has not caught on would be a gross understatement. Higher order programming has been has been advocated more in newer logic programming languages such as HiLog [CKW93], Lambda Prolog [NM88][GH95], Mercury [SHCQ5] and the many combined logic and functional languages (see [Han94]). Some advocates of these languages are apparently unaware of the techniques available to Prolog programmers, despite the efforts of Richard O’Keefe and others.
One aim of this paper is to illustrate higher order programming techniques in Prolog.
We give examples to show the interaction between higher order programming and other features of Prolog such as nondeterminism, logic variables, ﬂexible modes, meta programming, Deﬁnite Clause Grammar notation and (in some systems) coroutining. Another aim is to point out a signiﬁcant difference between two ways in which higher order features are supported in logic programming languages. The superior method was suggested by David H.D. Warren over a decade ago. Since then higher order logic programming has gone off the rails. The Prolog coding style advocated by O’Keefe and the HiLog and Mercury languages use a less ﬂexible method which does not realise the full beneﬁts of higher order programming. The ﬁnal aim is to compare the higher order style with the “skeletons and techniques” approach to program development, one of the many approaches based on program patterns, schemata and cliches."