Best viewed in 24pt and full-screen
next up previous contents
Next: Un système ouvert Up: Implémentation Previous: Le rôle des combinateurs

Le rôle de la tex2html_wrap_inline53994-équivalence

La correspondance que l'on vient d'évoquer n'est valide que si la logique de tex2html_wrap_inline56836Prolog comprend l'axiome de tex2html_wrap_inline53994-équivalence*. Autrement, deux termes non-tex2html_wrap_inline55724-équivalents, tex2html_wrap_inline51794 et tex2html_wrap_inline56010, ne seraient pas distingués car tex2html_wrap_inline52306.

Muni de la tex2html_wrap_inline53994-équivalence, on peut pousser cette correspondance jusqu'à un idiome de programmation où tex2html_wrap_inline56836-abstraction et quantification universelle sont symétriques. Cela permet de convertir à volonté des tex2html_wrap_inline56836-abstractions en des quantifications universelles et des tex2html_wrap_inline56836-variables en des constantes universelles. Cette symétrie sert de fil directeur à notre reconstruction pragmatique de tex2html_wrap_inline56836Prolog* [Belleannée et al. 95], mais elle a aussi des conséquences importantes pour l'implémentation [Brisset et Ridoux 92b].

figure30938
Figure 7: Réduction de graphe et tex2html_wrap_inline53980-rédex

La représentation des termes qui est la plus commode pour l´unification* modulo tex2html_wrap_inline54254-équivalence est leur forme normale de tête tex2html_wrap_inline53994-longue* [Huet 75]. Pour ne pas avoir à la calculer à chaque unification, les termes sont systématiquement représentés de cette manière dès leur création. On construit ainsi beaucoup de tex2html_wrap_inline56836-abstractions que l'on peut juger artificielles, et aussi beaucoup de tex2html_wrap_inline53988-rédex qui le sont autant. Il ne faudrait pas mobiliser toute la procédure de réduction de graphe pour ces tex2html_wrap_inline53988-rédex. Pour cela, on distingue les tex2html_wrap_inline56836-abstractions issues d'une tex2html_wrap_inline53994-expansion en les appelant des tex2html_wrap_inline52492-abstractions. La procédure de réduction de graphe peut alors reconnaître les tex2html_wrap_inline53988-rédex construits à l'aide de tex2html_wrap_inline52492-abstractions : on les appelle des tex2html_wrap_inline53980-rédex*. Ceux là peuvent être réduits en construisant simplement une nouvelle application (voir à la figure 7 la nouvelle application où le pointeur vers tex2html_wrap_inline52342 est remplacé par un pointeur vers tex2html_wrap_inline52344). Il ne faut noter comme tels que les tex2html_wrap_inline53994-rédex qui le resteront quelles que soient les tex2html_wrap_inline53988-réductions qui leur seront appliquées : ce sont les tex2html_wrap_inline53994-rédex qui sont en forme normale de tête*.

Les tex2html_wrap_inline56836-variables sont aussi tex2html_wrap_inline53994-expansées et cela est la cause d'une autre forme de tex2html_wrap_inline53988-rédex «abusifs». À cause de la tex2html_wrap_inline53994-expansion, une tex2html_wrap_inline56836-variable tex2html_wrap_inline53952 de type fonctionnel aura toutes ces occurrences remplacées par tex2html_wrap_inline52364. Lorsqu'une tex2html_wrap_inline53988-réduction cause le remplacement de la tex2html_wrap_inline56836-variable tex2html_wrap_inline53952 par un terme tex2html_wrap_inline52380, c'est toute sa forme tex2html_wrap_inline53994-expansée qu'il faut remplacer, et pas seulement tex2html_wrap_inline53952. En effet, remplacer seulement tex2html_wrap_inline53952 par tex2html_wrap_inline52380 créerait des tex2html_wrap_inline53988-rédex parasites de la forme tex2html_wrap_inline52384. Il faut donc reconnaître les tex2html_wrap_inline56836-variables tex2html_wrap_inline53994-expansées. Cela se fait de la même manière que pour reconnaître les tex2html_wrap_inline53994-rédex.

La combinaison de ces deux heuristiques produit un gain de complexité important. Par exemple, sachant que tex2html_wrap_inline52498 dénote tex2html_wrap_inline52394 et est tex2html_wrap_inline53994-expansé en tex2html_wrap_inline52398 et que tex2html_wrap_inline52400 dénote tex2html_wrap_inline52402, le terme tex2html_wrap_inline52404 est tex2html_wrap_inline53994-expansé en tex2html_wrap_inline52408, et se tex2html_wrap_inline53988-normalise naïvement en un nombre d'étapes qui est en cube du nombre de tex2html_wrap_inline52498. Ce nombre devient quadratique quand la première heuristique est appliquée et linéaire lorsque les deux le sont. On peut s'en convaincre en regardant la trace de la tex2html_wrap_inline53988-réduction naïve de la forme tex2html_wrap_inline53994-expansée de tex2html_wrap_inline52418.

  1. Les premières tex2html_wrap_inline53988-réductions emboîtent des tex2html_wrap_inline52492-abstractions.

    tex2html_wrap_inline52488

    tex2html_wrap_inline52426

    tex2html_wrap_inline52428 tex2html_wrap_inline52444

  2. Elles introduisent des tex2html_wrap_inline53988-rédex qui nécessitent de nombreuses duplications. Les termes dupliqués sont soulignés. Ils ne sont pas des combinateurs, car la tex2html_wrap_inline56836-variable tex2html_wrap_inline56416 y est libre, et n'offrent donc pas prise à l'heuristique de la section précédente.

    tex2html_wrap_inline52438 tex2html_wrap_inline52444

    tex2html_wrap_inline23087

    tex2html_wrap_inline52446

  3. Le troisième tex2html_wrap_inline52498 cause encore plus de tex2html_wrap_inline53988-rédex parasites, ...

    tex2html_wrap_inline52452

    tex2html_wrap_inline52454 tex2html_wrap_inline52468

  4. ... qui nécessitent encore plus de duplications

    tex2html_wrap_inline52458 tex2html_wrap_inline52468

    tex2html_wrap_inline52462 tex2html_wrap_inline52468

    tex2html_wrap_inline52466 tex2html_wrap_inline52468

    tex2html_wrap_inline52470

    tex2html_wrap_inline52472

    tex2html_wrap_inline52474

Le coût de duplication est proportionnel à la taille des termes soulignés. Le coût total est donc cubique. Avec la première heuristique, les étapes de tex2html_wrap_inline53988-réduction sont les mêmes, mais il n'y a plus de duplication. Le coût total devient quadratique. La deuxième heuristique va éviter d'emboîter des tex2html_wrap_inline52492-abstractions. Il y a donc moins de tex2html_wrap_inline53988-rédex et moins de tex2html_wrap_inline53988-réductions. La trace de la tex2html_wrap_inline53988-réduction avec les deux heuristiques est la suivante, où les numéros correspondent aux mêmes étapes que pour la tex2html_wrap_inline53988-réduction naïve.

  1. La réduction commence comme plus haut, ...

    tex2html_wrap_inline52488

    tex2html_wrap_inline52490

  2. ... mais n'emboîte pas de tex2html_wrap_inline52492-abstractions.

    tex2html_wrap_inline52494

  3. Une tex2html_wrap_inline53988-réduction suffit pour atteindre le troisième tex2html_wrap_inline52498, et ...

    tex2html_wrap_inline52500

    tex2html_wrap_inline52502

    tex2html_wrap_inline52504

  4. ... aucune duplication n'est nécessaire.

    tex2html_wrap_inline52506

    tex2html_wrap_inline52474

Le coût de la tex2html_wrap_inline53988-réduction de chaque tex2html_wrap_inline52498 est constant. Le coût total est donc linéaire avec le nombre de tex2html_wrap_inline52498.

Le point de départ de cette discussion sur l'effet de la tex2html_wrap_inline53994-équivalence sur l'implémentation était la symétrie entre les deux quantifications essentiellement universelles, tex2html_wrap_inline56836 et tex2html_wrap_inline55356. Cette symétrie se traduit par des remplacements de tex2html_wrap_inline56836-variables par des constantes universelles*, ou de constantes universelles par des tex2html_wrap_inline56836-variables. Ces remplacements sont fréquents et le programmeur les exprime par des tex2html_wrap_inline53988-rédex. Il est aussi fréquent qu'un remplacement soit suivi peu après par le remplacement inverse. À cause des duplications qu'elle implique (même en considérant les heuristiques décrites), la réduction de graphe n'est pas le bon choix pour implémenter ce qui n'est en fait qu'un changement de point de vue sur un terme. Nous avons donc choisi d'adapter la technique des substitutions explicites* [Revesz 88] à la réduction de graphe, mais uniquement pour traiter la correspondance entre constantes universelles et tex2html_wrap_inline56836-variables (tex2html_wrap_inline55796 tex2html_wrap_inline56490*). Cela permet de défaire l'effet d'un remplacement simplement en enlevant la substitution explicite qui le représente. Il faut bien sûr trouver une représentation tex2html_wrap_inline52106 de ces nouveaux objets, qui sont essentiellement des triplets de termes tex2html_wrap_inline52532 (pour tex2html_wrap_inline52534 remplace tex2html_wrap_inline51494 dans tex2html_wrap_inline55774), et programmer les opérations associées : création, propagation, suppression et réalisation de substitution explicite.

De ces deux développements un peu techniques sur le rôle des combinateurs et de la tex2html_wrap_inline53994-équivalence, il faut retenir qu'un système complexe ne se range pas facilement dans une catégorie préétablie. Par exemple, notre implémentation de tex2html_wrap_inline56836Prolog met en tex2html_wrap52064uvre la réduction de graphe, mais lui ajoute des améliorations qui correspondent à des traits particulier de tex2html_wrap_inline56836Prolog. La réduction de graphe fournit un cadre général dont la principale qualité est la simplicité, celle de la gestion de mémoire en particulier. Nous l'avons choisi pour cela. La réduction de graphe prévoit des opérations qui sont parfois coûteuses, et une première forme d'amélioration consiste à trouver des heuristiques qui permettent de remplacer les opérations coûteuses par des opérations qui le sont moins ou même de simplement les éviter. Une seconde forme d'amélioration consiste à ajouter à la réduction de graphe des opérations qui viennent d'autres paradigmes comme les substitutions explicites.


next up previous contents
Next: Un système ouvert Up: Implémentation Previous: Le rôle des combinateurs

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