• Aucun résultat trouvé

Verbosit´e du typage polymorphe param´etrique

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 programme



Prolog. Par exemple, le pr´edicat pred ad hoc n’a pas de version purement



Prolog (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 programme



Prolog 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 `a



Prolog, 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 en



Prolog, en faisant toutefois attention que les invariants de



Prolog 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 programmes



Prolog 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.