Best viewed in 24pt and full-screen
next up previous contents
Next: Manipuler les expressions dans Up: Prolog Previous: La métaprogrammation

Métaprogrammation en Prolog et tex2html_wrap_inline56836Prolog

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 suivantegif 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 tex2html_wrap_inline56836Prolog, 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 tex2html_wrap_inline56836-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 xtex2html_wrap_inline56812x xtex2html_wrap_inline56812(s 0) .

polynomial xtex2html_wrap_inline56812x .

translate (A , B) xstex2html_wrap_inline56812ystex2html_wrap_inline56812(sigma xs1tex2html_wrap_inline56812(A1 xs xs1 , B1 xs1 ys) ) :- translate A A1 , translate B B1 .

L'usage des tex2html_wrap_inline56836-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 tex2html_wrap_inline56836-abstraction) est représentée par une tex2html_wrap_inline56836-abstraction du métalangage, tex2html_wrap_inline56836Prolog. 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 tex2html_wrap_inline56836-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.


next up previous contents
Next: Manipuler les expressions dans Up: Prolog Previous: La métaprogrammation

Olivier Ridoux
Mon Apr 27 11:10:23 MET DST 1998