En Prolog, la représentation la plus souvent utilisée pour les variables objet* est la représentation non-close*. Dans celle-ci, les variables objet sont représentées par des variables de Prolog. On trouve de nombreux exemples de cette solution dans les ouvrages de référence. Il suffit de chercher dans les chapitres consacrés aux manipulations des programmes et des formules.
Par exemple, on trouve la clause suivante dans le programme 16.2 de L'Art de Prolog de Sterling et Shapiro [Sterling et Shapiro 90] (page 257 de cet ouvrage).
translate (A , B) (A1 , B1) Xs/Ys :- translate A A1 Xs/Xs1 , translate B B1 Xs1/Ys .
Cette clause fait partie d'un programme de traduction de règles de grammaire en clauses Prolog. Toutes les clauses du prédicat translate ont la même structure. Leur premier paramètre est un composant de règle de grammaire, le second est le composant de clause Prolog qui lui correspond et le dernier est une paire de variables devant figurer dans la clause Prolog produite. Ce sont donc des variables objet. Elles sont représentées directement par des métavariables, et il n'est donc plus possible de lire cette clause selon la sémantique déclarative de Prolog car elle ne rend pas compte du rôle que jouent les Xs et Ys. Puisque ce sont des variables de la clause produite, cela n'a aucun sens d'en considérer des instances, mais c'est pourtant ainsi qu'est construite la sémantique déclarative. Cela ne marche en Prolog que parce que l'interpréteur calcule les solutions les plus générales du problème d'unification. C'est donc la sémantique opérationnelle qui permet de comprendre cette clause, mais pas la sémantique déclarative.
Dans le même ouvrage, on trouve la clause (derivative X X (s 0)). C'est la première clause d'un programme qui calcule la dérivée d'une fonction par rapport à X. Une des conséquences logiques de cette clause est (derivative 72 72 (s 0)), qui est absurde. On trouve à la page précédente du même ouvrage la clause (polynomial X X) qui fait partie de la définition de ce qu'est un polynôme en X. Elle a des conséquences logiques aussi absurdes : (polynomial 72 72).
Dans ces exemples, la facilité de substitution est utilisée au détriment de la déclarativité et au prix de l'obligation pour le programmeur de vérifier la correction de la manipulation des termes objet par rapport à la sémantique opérationnelle. Une autre représentation, dite close*, utilise des constantes pour représenter les variables objet. Dans ce cas, on retrouve la déclarativité, mais la substitution et le renommage deviennent des opérations très couteuses.
En Prolog, la représentation naturelle pour la métaprogrammation est la représentation par abstraction*. Toute construction du langage objet qui introduit des noms avec une certaine portée est représentée par une -abstraction dont l'en-tête représente les noms introduits et le corps leur portée. Cela conduit à la version suivante des clauses critiquées plus haut.
derivative xx x(s 0) .
polynomial xx .
translate (A , B) xsys(sigma xs1(A1 xs xs1 , B1 xs1 ys) ) :-
translate A A1 , translate B B1 .
L'usage des -termes apporte la gestion cohérente et déclarative des portées et des substitutions. On convient que dans ce qui suit toute structure objet introduisant des noms (par exemple, quantification, bloc, ou -abstraction) est représentée par une -abstraction du métalangage, Prolog. Nous ne nous prononçons pas encore sur d'autres aspects de la représentation des structures objet. Les exemples qui précèdent sont des clauses de Prolog où des -termes sont utilisés au lieu de termes de premier ordre. Nous allons voir que la manipulation d'expressions d'un langage objet complexe justifie aussi d'augmenter le langage des formules de Prolog.