Best viewed in 24pt and full-screen
next up previous contents
Next: Structures relationnelles Up: Prospective Previous: Fragments décidables

Preuve et calcul

La sémantique opérationnelle qui domine actuellement la programmation logique en Prolog est celle qui est modélisée par la tex2html_wrap_inline53120-résolution. Elle consiste à partir d'un but et à le déplier jusqu'à ne plus pouvoir. Si à ce moment le but est vide, on dit que c'est un succès, sinon, on dit qu'on a un échec. De ce point de vue, la situation n'est pas très différente en tex2html_wrap_inline56836Prolog. On cherche une preuve uniforme au lieu d'une preuve tex2html_wrap_inline53120.

C'est une technique «descendante». Cette sémantique est intuitivement simple, mais elle conduit à des implémentations incomplètes. Des variantes de cette sémantique opérationnelle comme la tex2html_wrap_inline53122-résolution [Chen et Warren 93] sont moins simples mais conduisent à des implémentations complètes, y compris pour différentes formalisations de la négation par l'échec. Elles consistent à distinguer des prédicats qui feront l'objet d'une exécution où leurs conclusions intermédiaires sont mémorisées. Ce sont des techniques essentiellement descendantes, mais qui injectent une composante remontante pour traiter les prédicats mémorisés.

On peut envisager une autre approche qui serait essentiellement remontante. Des prédicats seraient distingués comme représentant un état et seraient exécutés de manière purement remontante. Cela consiste à partir de faits qui décrivent l'état initial, et à dériver l'ensemble de leur conséquences immédiates, puis les conséquences immédiates de celles-ci, etc. Si le corps d'une clause d'un prédicat d'état contient un but d'un prédicat qui n'est pas d'état ce but est exécuté par la technique descendante. Dans cette approche, les prédicats d'état représentent l'état du système, alors que les autres ne représentent que des relations purement logiques. L'état du système évolue au fur et à mesure du calcul des conséquences immédiates de premier rang, de second rang, etc. C'est donc le rang des conséquences immédiates qui modélise l'horloge du système. Celui-ci s'arrête quand aucune nouvelle conséquence ne peut être calculée.

Nous pensons que cette approche fournit une meilleure interface avec l'environnement que la convention habituelle qui considère la conjonction dans les buts comme signifiant la séquentialité. Elle ouvre cependant de nouveaux problèmes. Premièrement, les gestions de mémoire connues pour la programmation logique, dont celle de tex2html_wrap_inline52106, font l'hypothèse d'une exécution essentiellement descendante, alors que dans la nouvelle approche elle est essentiellement remontante. Le calcul de chaque conséquence immédiate d'un rang donné consomme de la mémoire et il faut la libérer à chaque fois qu'une conséquence immédiate d'un rang donné ne peut plus être utilisée dans un rang supérieur. Mais, comment le prouver ? Probablement en considérant le graphe d'appel des prédicats d'état comme le germe d'un ordonnancement des tâches. Deuxièmement, on retrouve un problème déjà connu en base de données et qui est que la résolution remontante naïve est inefficace. Là encore, le graphe d'appel des prédicats d'état semble devoir jouer un rôle.


next up previous contents
Next: Structures relationnelles Up: Prospective Previous: Fragments décidables

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