  Processing programs as data is one of the successes of functional and logic
programming. Higher-order functions, as program-processing programs are called
in functional programming, and meta-programs, as they are called in logic
programming, are widespread declarative programming techniques. In logic
programming, there is a gap between the meta-programming practice and its
theory: The formalisations of meta-programming do not explicitly address its
impredicativity and are not fully adequate. This article aims at overcoming
this unsatisfactory situation by discussing the relevance of impredicativity to
meta-programming, by revisiting former formalisations of meta-programming and
by defining Reflective Predicate Logic, a conservative extension of first-order
logic, which provides a simple formalisation of meta-programming.
