Best viewed in 24pt and full-screen
next up previous contents
Next: Prospective Up: Typage Previous: Typage polymorphe paramétrique

Verbosité du typage polymorphe paramétrique

Nous avons apporté une réponse formelle à la verbosité de la notation sous la forme d'une procédure qui complète les notations de type manquantes [Louvet et Ridoux 96, Louvet 96]. Elle permet d'omettre la plupart des notations de type, pour les laisser reconstituer par un compilateur. L'intuition que l'inférence de type au second ordre n'est pas faisable semble contredire la possibilité de cette complétion. En effet, au second ordre, il n'y a pas de type principal, et après une longue période où on ne savait pas si le problème d'inférence était décidable [Leivant 83, Mitchell 84, Pierce et al. 89] Wells a prouvé que ce problème ne l'était pas [Wells 94]. En fait, la complétion proposée n'a pas pour but de résoudre complètement l'inférence de type au second ordre : comme en tex2html_wrap_inline56836Prolog, les types des constantes et des prédicats doivent être donnés, et les tex2html_wrap_inline53072-quantifications inférées sont toutes prénexes. Par exemple, partant des déclarations suivantes,

type p A -> B -> (paire A B) .

type appliquer_à_paire tex2html_wrap_inline53072D(D->D) -> (paire A B) -> (paire A B) -> o .

appliquer_à_paire F (p G D) (p ([F TypeG] G) ([F TypeD] D)) .

la complétion reconstitue d'abord les tex2html_wrap_inline53072 manquants dans les déclarations de type,

type p tex2html_wrap_inline53072Atex2html_wrap_inline53072B( A -> B -> (paire A B) ) .

type appliquer_à_paire tex2html_wrap_inline53072Atex2html_wrap_inline53072B( tex2html_wrap_inline53072D(D->D) -> (paire A B) -> (paire A B) -> o ) .

puis les applications de type dans les clauses,

[appliquer_à_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, tex2html_wrap_inline55356, et les quantifications de variables de type, tex2html_wrap_inline53076.

tex2html_wrap_inline53076 TypeG tex2html_wrap_inline53076 TypeD tex2html_wrap_inline55356D:TypeD tex2html_wrap_inline55356G:TypeG tex2html_wrap_inline55356F:tex2html_wrap_inline53072D(D->D)
         ([appliquer_à_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écoraient les deux applications de la fonction F ont été dupliquées comme paramètres de appliquer_à_paire et p. C'est ce qui va permettre la propagation des informations de type jusqu'aux points que le programmeur a explicitement annoté dans le source du programme.

La procédure de complétion permet de convertir au polymorphisme paramétrique tous les programmes tex2html_wrap_inline56836Prolog. Cependant, tous les programmes paramétriques ne sont pas accessibles par complétion d'un programme tex2html_wrap_inline56836Prolog. Par exemple, le prédicat pred_ad_hoc n'a pas de version purement tex2html_wrap_inline56836Prolog (avec condition de tête). En fait, les programmes qui implémentent du polymorphisme ad-hoc ne peuvent pas être atteints par complétion d'un programme tex2html_wrap_inline56836Prolog vérifiant la condition de tête. 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été en le programme suivant,

type plus tex2html_wrap_inline53072A( A -> A -> A -> o ) .

type conc tex2html_wrap_inline53072A( (list A) -> (list A) -> (list A) -> o ) .

tex2html_wrap_inline53076 Atex2html_wrap_inline53076 B tex2html_wrap_inline55356X:Atex2html_wrap_inline55356Y:Atex2html_wrap_inline55356Z:A [plus A] X Y Z :- ( 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égée du programme.


next up previous contents
Next: Prospective Up: Typage Previous: Typage polymorphe paramétrique

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