Nous avons apport´e une r´eponse formelle `a la verbosit´e de la notation sous la forme d’une proc´edure qui compl`ete les notations de type manquantes [Louvet et Ridoux 96, Louvet 96]. Elle permet d’omettre la plupart des notations de type, pour les laisser re- constituer par un compilateur. L’intuition que l’inf´erence de type au second ordre n’est pas faisable semble contredire la possibilit´e de cette compl´etion. En effet, au second ordre, il
n’y a pas de type principal, et apr`es une longue p´eriode o`u on ne savait pas si le probl`eme d’inf´erence ´etait d´ecidable [Leivant 83, Mitchell 84, Pierce et al. 89] Wells a prouv´e que ce probl`eme ne l’´etait pas [Wells 94]. En fait, la compl´etion propos´ee n’a pas pour but de r´esoudre compl`etement l’inf´erence de type au second ordre : comme en
Prolog, les types des constantes et des pr´edicats doivent ˆetre donn´es, et les-quantifications inf´er´ees sont toutes pr´enexes. Par exemple, partant des d´eclarations suivantes,type p A –
>
B –>
(paire A B) .type appliquer `a paireD(D–
>
D) –>
(paire A B) –>
(paire A B) –>
o .appliquer `a paire F (p G D) (p ([F TypeG] G) ([F TypeD] D)) .
la compl´etion reconstitue d’abord lesmanquants dans les d´eclarations de type,
type pAB( A –
>
B –>
(paire A B) ) .type appliquer `a paireAB(D(D–
>
D) –>
(paire A B) –>
(paire A B) –>
o ) . puis les applications de type dans les clauses,[appliquer `a paire TypeG TypeD] F
([p TypeG TypeD] G D)
([p TypeG TypeD]([F TypeG] G) ([F TypeD] D)) .
et enfin les quantifications manquantes, en distinguant les quantifications de variables de terme,8, et les quantifications de variables de type,88.
88TypeG88TypeD8D:TypeD8G:TypeG8F:D(D–
>
D)([appliquer `a paire TypeG TypeD] F
([p TypeG TypeD] G D)
([p TypeG TypeD]([F TypeG] G) ([F TypeD] D))) .
On peut constater que les variables de types qui d´ecoraient les deux applications de la fonction F ont ´et´e dupliqu´ees comme param`etres de appliquer `a paire et p. C’est ce qui va permettre la propagation des informations de type jusqu’aux points que le programmeur a explicitement annot´e dans le source du programme.
La proc´edure de compl´etion permet de convertir au polymorphisme param´etrique tous les programmes
Prolog. Cependant, tous les programmes param´etriques ne sont pas ac- cessibles par compl´etion d’un programmeProlog. Par exemple, le pr´edicat pred ad hoc n’a pas de version purementProlog (avec condition de tˆete). En fait, les programmes qui impl´ementent du polymorphisme ad-hoc ne peuvent pas ˆetre atteints par compl´etion d’un programmeProlog v´erifiant la condition de tˆete. Par exemple,type plus A –
>
A –>
A –>
o .type conc (list A) –
>
(list A) –>
(list A) –>
o . [plus A] X Y Z:–( A = int ==
>
Z = X + Y; A = (list B) ==
>
conc X Y Z ) . est compl´et´e en le programme suivant,type plusA( A –
>
A –>
A –>
o ) .type concA( (list A) –
>
(list A) –>
(list A) –>
o ) . 88A88B8X:A8Y:A8Z:A( A = int ==
>
[= A] Z (X + Y); A = (list B) ==
>
[conc B] X Y Z ) .mais on ne peut pas se passer de mentionner les variables de type A et B dans la version abr´eg´ee du programme.
Prospective
Tous les travaux que nous avons pr´esent´e ici peuvent ˆetre prolong´es d’une mani`ere ou d’une autre. Dans certains cas, il s’agit de continuer la recherche sur
Prolog. Dans d’autres cas, notre exp´erience de la programmation logique nous fait penser `a d’autres formes qu’elle pourrait prendre. Et enfin, notre exp´erience en programmation en g´en´eral nous sugg`ere une forme d’organisation qui est inspir´ee de la logique mais qui d´epasse la programmation. `A tout cela s’ajoute la longue liste de questions non r´esolues et dont nous ne parlerons pas ici.Impl´ementation
Notre impl´ementation de
Prolog a montr´e que ce langage est utilisable en vraie gran- deur (par exemple, 13000 lignes pour le compilateur Prolog/MALIet les librairies de base). Cependant, il reste beaucoup `a faire pour l’am´eliorer. Premi`erement, nous n’avons explor´e que les traits propres `aProlog, en nous contentant d’une impl´ementation simple, mais rai- sonnable, des traits communs avec Prolog. Beaucoup de travail portant sur les traits Prolog pourrait ˆetre import´e enProlog, en faisant toutefois attention que les invariants deProlog ne sont pas ceux de Prolog.En particulier, beaucoup de travail a ´et´e fait en Prolog sur le th`eme de l’analyse statique et globale de programme. Ces travaux n’ont eu qu’un impact moyen sur les syst`emes Prolog courants, mais il existe un syst`eme de programmation logique, appel´e Mercury [Somogyi et al. 96], qui est tr`es pragmatique et o`u l’analyse statique et globale des programmes est centrale. Les propri´et´es d’int´erˆet pour le syst`eme Mercury sont les
modes(104), ladirectionnalit´e(104)des pr´edicats et leurmultiplicit´e(105). Cela permet entre autre
au compilateur Mercury de calculer un ordonnancement efficace des buts. Le caract`ere pragmatique de Mercury vient de ce que ce calcul est rendu efficace par des restrictions portant sur les programmes. Dans notre impl´ementation de
Prolog, nous faisons bien sˆur une analyse statique des programmes (d´etection de combinateurs, allocation de registre, etc.), mais elle n’est jamais globale car elle ne prend jamais en compte les interactions entre pr´edicats. Nous pourrions l’´etendre `a des propri´et´es globales en adoptant le mˆeme esprit pragmatique de Mercury.Deuxi`emement, mˆeme pour les traits propres `a
Prolog, nous n’avons pas ´et´e aussi loin que nous l’aurions souhait´e. Par exemple, il reste beaucoup `a faire pour que l’usage de l’implication soit aussi efficace que possible. En particulier, l’utilisation de l’implication pour structurer les programmesProlog comme on peut le faire `a l’aide du let enMLne pourra se faire que s’il n’y a pas de coˆut associ´e.On pourrait aussi ´etudier des propri´et´es sp´ecifiques `a
Prolog comme le fait de savoir si les arguments d’un pr´edicat sont pass´es en forme normale ou non. Enfin, quelques aspects ont ´et´e trait´es de mani`ere conservatoire faute d’une id´ee claire de ce qu’il fallait faire.Dans certains cas, des avanc´ees th´eoriques sont intervenues pour faire avancer le probl`eme, et elles ont des cons´equences sur l’impl´ementation. C’est le cas du typage param´etrique. L’impl´ementation de
2Prolog `a la lumi`ere de l’approche pragmatique de Mercury nous semble donc une tˆache utile et int´eressante.