A reviewer of one of my papers recently commented the following:
In logic it can be important to distinguish meta-level inference from inference involving second-order formulae. In logic programming and Prolog in particular the differences are much less apparent.
I have encountered this “meta-level” term a few times already and I’m scratching my head about what it means. My best guess is that it refers to Prolog’s lack of distinction between function and predicate symbols.
To clarify, in First Order Logic (FOL) a language includes disjoint sets of function and predicate symbols. So in FOL S(t_1, ..., t_n)
where S
is a symbol, can either be an atomic formula, if S
is a predicate symbol, or a term, if S
is a function symbol but not both!
In Prolog on the other hand there is no distinction between function and predicate symbols, and in fact there is no such thing as “functions”. So in S(t_1, ..., t_n)
the symbol S/n
is a “functor”, S(t_1, ..., t_n)
is always called a “term” (or, confusingly, “literal”) and there may or may not be a “predicate” S/n
(where a predicate is a set of clauses with S/n
in the head).
In general, Prolog syntax is much more permissive than FOL and the result, as far as I understand it is that Prolog is not a first-order language despite it always been described as one. It’s really more like a “1.5-order language”.
In any case, it seems to me that “meta-level” really refers to this permissiveness of Prolog, compared to FOL, that makes it possible to write logic programs (i.e. “predicates”) that take other logic programs as arguments. For example, this permissiveness is the reason we can write meta-interpreters in Prolog, or other “meta-predicates”.
What does everyone think?