HAL Id: inria-00000067
https://hal.inria.fr/inria-00000067
Submitted on 26 May 2005
HAL is a multi-disciplinary open access archive for the deposit and dissemination of sci- entific research documents, whether they are pub- lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers.
L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés.
Un Système de Module Fermé pour la PLC
Rémy Haemmerlé, Francois Fages
To cite this version:
Rémy Haemmerlé, Francois Fages. Un Système de Module Fermé pour la PLC. Premières Journées
Francophones de Programmation par Contraintes, CRIL - CNRS FRE 2499, Jun 2005, Lens, pp.169-
178. �inria-00000067�
Un Système de Modules Fermé pour la PLC
Rém y Haemmerlé François Fages
INRIA,Projet Contraintes
Domaine de Volueau, Roquenourt
BP 105, 78153Le Chesnay Cedex, Frane
Remy.Haemmerleinria.fr Franois.Fagesinria.fr
Résumé
Cet artile présente un système de modules pour
laProgrammationLogiqueparContraintes.Cesystème
simple et relativement indépendant du langage préis
d'utilisation(ilaétéonçuàl'originepourGNU-Prolog)
alapartiularitéd'êtrefermé.Parferménousentendons,
le fait qu'il est apable de prévenir tout appel à des
parties privéesd'un module depuis l'extérieurde elui-
i. Bienqu'il puisseêtre vuomme unesimple ouhe
de sure syntaxique, e systèmeore unedisiplinede
nommage des prédiats permettant de développer des
bibliothèqueset defailiterlaréutilisationduode.De
plus,enajoutantaulangageuneformedefermeturein-
spiréedelaprogrammationonurrentelinéaireparon-
traintes,nousmontronsommentonrésoutleproblème
bienonnude l'utilisationdelaméta-programmationà
travers le système de modules, en distinguant l'exéu-
tion d'unterme (prédiat all) de l'appliationd'une
fermeture(ordresupérieur).
Abstrat
ThisartilepresentsamodulesystemfortheLogi
ConstraintProgramming.Thissystemsimpleandpretty
independentapreiselanguage(itwasreatedattheori-
gin forGNU-Prolog)hasthe partiularitytobe losed
. By losed we meen the fat that the system isable
to prevent any allto private parts of a module from
the exterior of this one. Although it an be seen like
a simple layer of syntati sugar, this system oers a
disiplineofprediatesnaming,makingpossiblethede-
veloppementoflibrariesandfailitatingthere-useofthe
ode.Morevoer,byaddingaformoflosuresinspiredby
LinearConurrentConstraint programming tothe lan-
guage, we show how the well-knownproblem of using
meta-programmingthrough themodulesystem anbe
solvedbydistinguishingtheexeution ofaterm(predi-
ateall)fromthesendingofalosure(higherorder).
1 Introdution
Ilestsouventplusfailedetravailleraveunnombre
restreint de onepts à l'esprit. Ainsi pour être érit
proprement,les programmes degrande taille doivent
être divisés en blo de taille plus limitée. Bien que
ela puisse être fait dans n'importe quel langage, un
systèmedemodulesappropriéfailitelasegmentation
desprogrammesenobligeantleprogrammeuràdénir
lairement la limite et l'interfae de haun de es
blos. Beauoup d'erreurs peuvent être alors évitées,
leompilateur étant en hargede vérier quelesap-
pelsentre modules respetentlesinterfaesdélarées.
Unetelle segmentationduodefavoriseaussilaom-
préhension d'un programme par des personnes ex-
térieuresetaméliorentainsisaréutilisation.
Un des objetifs de notre équipe 1
est de onevoir
une implémentation de la Programmation Linéaire
Conurrente parContraintes (LCC) [12℄ basée sur la
tehnologie de ompilation en ode natif de GNU-
Prolog [8℄. Avant de ommener à proprement parlé
le développement de e système, que nous avonsap-
pelé SiLCC pour SiLCCis Linear Conurrent Con-
straintprogramming,ilaéténéessairedeonevoir
un système de modules 2
. L'objetif de et artile est
deprésenterleshoixthéoriquesetpratiquesquenous
avonsfaits.Pourdesraisonsdesimpliitéetpareque
nouspensons,ommeLeroy[18℄quelaprogrammation
modulaireapeuàvoiravelespartiularitésden'im-
porte quel langage de programmation nous présen-
terons notre systèmede modules dansle ontextede
laProgrammationLogiqueparContraintes(PLC)[17℄
pluttquedansleontexteplusgénéraldeLCC.
1
ProjetContraintes,INRIAhttp://ontraintes.inri a.fr
2
Nous ommençons en présentant ii les objetifs
prinipauxqu'unsystèmedemodules doitremplir:
Protetion du Code. Un programmeur doitpou-
voirprotégersonodeontredesintrusionsfaites
parduodeétranger.Celasigniequ'ildoitêtre
possibledelimiterl'aèsàunmoduledepuisl'ex-
térieurdeelui-i. Parlasuite,nousdironsqu'un
systèmedemodules quiassureuneprotetionde
ode est unsystème fermé,dans leas ontraire
nouslequalieronsd'ouvert.
Séparation de l'espae des noms. Dans lessys-
tèmes sans module, les onits de noms sont
fréquents et perturbants. En eet, pour être sûr
d'éviter de tels problèmes, le programmeur est
souventontraintdepréxersystématiquementle
nomdetoussesprédiats.Unsystèmedemodules
permet d'éviterdefaçontransparente lesonits
denoms.
Compilationséparée.Ildoitêtrepossibledeom-
piler indépendamment haque module d'un pro-
gramme. En partiulier les bibliothèques stan-
dardsserontompiléesunefoispourtoutes.
Boostrap de SiLCC. Un trait partiulièrement
original de SiLCC est la réalisation d'un lan-
gage de programmation par ontraintes entière-
mentbootstrappéàpartird'unpetitnoyau(LCC
aveontraintesdegraphesétiquetés).Lesystème
demodulesestfondamental aubootstrap.
Par ailleurs le système de modules doit satisfaire
d'autresritères:
Simpliité. Nous ne voulons pas que le système
de modules limite les failités de Prologpour le
développementrapide.En partiulier:
Laonision des programmes Prologdoit être
préservée, nous souhaitons éviter notamment
d'introduiretropdedélarationsobligatoires.
Le système doit permettre la méta-program-
mation (.à.d. fournir le prédiat all), qui
noussemble partiulièrement utile pour érire
untop-leveloudesmeta-interpréteurs.
Nous voulons éviter l'introdution de trop de
nouveauxoneptsquipourraientperturberles
habitudesdesprogrammeurs.
Considérationssémantiques.Notresystèmeainsi
que ses propriétés doivent avoir une dénition
formelle.
Implémentation faile. Le système de modules
doitêtre faile àoder et àporter au-dessus de
diérents langages logiques. En eet puisque la
oneption de SiLCC n'est pas terminée, nous
prototype.
1.2 Travauxantérieurs
La modularité dans le ontexte de la programma-
tion logique a été onsidérablement étudiée. An de
rendre ompte des notions importantes de modular-
ité, telles que le masquage d'informations ou les re-
lations d'import/export, ertainesapprohesutilisent
desextensionsdelaprogrammationlogiquelassique.
Nouspouvonsiterparexemplelesextensionspardes
impliations imbriquées [19℄, en méta logique [3℄ ou
en logique du seond ordre [7℄. D'autres approhes,
ommelaprogrammationlogiqueontextuelle[20℄ ou
l'extension orientée objet [21℄ vont plus loin en pré-
onisant l'adoption de onepts plus puissantsqu'un
systèmedemodulesstatiques.
Plusieursautrespropositionsajoutentdesonstru-
tionspermettantdedélareretdemanipulerdesmod-
ules.D'unotéilyalesalulsdemodulesdeO'Keefe
[22℄ ou de Sannellaet Wallen[24℄ inspirés dela pro-
grammationfontionnelle.Del'autreilyalessystèmes
dits syntaxiques (parequ'ilsne s'oupentque dela
tabledessymboles)utilisésparlaplupartdessystèmes
Prologourants(parexempleSICStus[26℄,SWI[28℄,
ECLiPSe [1℄, XSB [23℄, Ciao [4, 5℄). Néanmoins au-
und'entreeuxnerespetetouslesobjetifsquenous
avons présentés préédemment. Par exemple, le sys-
tème SICStusnefournit auuneprotetionduode.
Bienquelessystèmessyntaxiquesaientétéritiqués
(parexempledans[22,24℄),nousavonsdéidé,omme
Cabeza et Hermenegildo [6℄, d'adopter e hoix. Les
raisonsprinipalesensontsa simpliitéet laompat-
ibilité oerteavelesbibliothèques existantes omme
CLP(q,r)deHolzbaur[14℄ouCHRdeShrijvers[25℄,
quenousprojetonsd'employer.
1.3 Plan
Le papier est organisé omme suit. La setion 2
propose une sémantique formelle pour les systèmes
syntaxiques dans le ontexte formel de la PLC ave
méta-programmation. Nous montrons également que
e système garantit la protetion du ode. Dans la
setion 3 nous donnons un méthode formelle pour
traduire des programmes modulaires ontenant des
méta-appels en programmes PLC purs (omme dé-
nis dans [17℄). Puis, à la setion 4, nous présentons
l'utilisationpragmatiquedenotresystème.Lasetion
5présenteleproblèmequeposel'utilisationdel'ordre
supérieuràtraversunsystèmedemodules,et lesdif-
ultésqueelaposentdanslessystèmessyntatiques
fermeture, inspirée de LCC, qui permet de résoudre
es problèmes.
2 PLC Modulaire
Nous présentons ii une sémantique formelle pour
la Programmation Logique par Contraintes Mod-
ulaire (PLCM), et son extension pour la méta-
programmation.
2.1 Syntaxeetdénitions
Danslasuiteonsupposeque:
V
est unensembledevariablesdénombrable;Σ F
estl'ensembledessymbolesdefontions;
Σ C
est un ensemble de symboles de prédiats(l'ensembledesontraintes);
Σ P
estl'ensembledessymbolesdeprédiats(dis-jointde
S C
);
Σ M
est l'ensemble desidentiantsdemodules.Pour des raisons de simpliité, nous supposons ii
que tout atome est qualié and ne dérivons pas les
onventionsstandard utilisées pour préxer automa-
tiquementlesatomesdonnéssansidentiantdemod-
ule.
Dénition 2.1(Clause) Une lausePLCMestune
formule
A 0 ← c 1 , . . . , c n |µ 1 : A 1 , . . . µ m : A m .
où les
c i
sont des ontraintes atomiques, lesA i
sontdesatomesetles
µ i
'ssontdesidentiantsdemodules.Dans la suite, nous appellerons atomes qualiés les
(µ i : A i )
etune lause seranotée de façononise parA ← c|α
.Dénition 2.2(Module) Unmoduleestun
n
-uplet(µ, D µ , I µ )
oùµ ∈ Σ M
est le nom du module,D µ
un ensemble de lauses est appelé implémentation du
module et
I µ ⊂ Σ P
est l'interfae du module. Si unsymbole
p
appartientàl'interfaed'unmoduleµ
,nousdirons que
p
estpublidansµ
.Dénition 2.3(Programme) Un programme
PLCM
P
est unensemble de modules dont les nomssont distints.
Dénition 2.4(But) Un but PLCM est une for-
mule
c 1 , . . . , c n | hν 1 − µ 1 :A 1 i , . . . , hν m − µ m :A n i
où les
c i
sont des ontraintes atomiques, les(µ j : A j )
sont des atomes qualiés et les
ν j
sont des identi-ants demodulesappelésdanse asontexted'appel.
hν j − µ j : A j i
seraappelé atomeaveontexte.Danslasuite
hν − (µ 1 : A 1 , . . . , µ n :A n )i
serauneno-tationsimpliéepourreprésenterlaséquened'atomes
aveontexte
(hν − µ 1 : A 1 i , . . . , hν − µ n : A n i)
.Example1.Pourillustrerleproblèmedel'utilisation
du all, étudions ladénition lassique du prediat
findall/3:
findall(X,G,_) :- all(G),
asserta(found(X)),
fail.
findall(_,_,L) :- ollet([℄,L).
ollet(S,L) :- retrat(found(X)),
ollet([X|S℄,L).
ollet(L,L).
L'utilisationdualldansesdélarations,n'empêhe
pasl'intrusiond'unautremoduleparunappelomme
findall(X,retrat(found(X)),L). Pour e prému-
nir de e genre de omportement, nous proposons la
sémantiquequisuit
2.2 SémantiqueOpérationnelle
Dénition2.5 (Transition) Soit
P
un programmePLCM. La relation de réériture
−→
sur les butsest dénie par la plus petite relation satisfaisant le
priniperésolutionCSLDmodulairesuivant.
(µ, D µ , I µ ) ∈ P (ν = µ) ∨ (p ∈ I µ ) (p(~s) ← c ′ |β)θ ∈ D µ X | = ∃(c ∧ ~s=~t ∧ c ′ ) (c|γ,
ν − µ : p(~t)
, γ ′ ) −→ (c, ~s =~t, c ′ |γ, hµ − βi , γ ′ )
IileprinipederésolutionCSLDlassique[11℄est
restreintpar laondition
(ν = µ) ∨ (p ∈ I µ )
. Celle itraduit le fait que
µ : p(~t)
ne peut être exéuté quesi l'appel est fait àpartir duontexte
µ
ou quesi leprédiat
p
estpublidanslemoduleµ
.Lemme2.6 Si
(c|γ) −→ (d|γ ′ , hν − Ai , γ ′′ )
est unetransition alors il existe un atome ave ontexte
µ − µ ′ : p( ~t)
dansla séquene
γ
telque :soit
ν = µ = µ ′
,soit
ν = µ ′
etp
estpublidansν
.Proposition2.7 (Masquage de l'implémenta-
tion) Soit
(c 0 |γ 0 ) −→ . . . −→ (c n |γ n )
une dérivation.Sil'atome
hµ − Ai
appartient àla séqueneγ n
alors :Soitil existeunatome
hµ − Bi
dansγ 0
,Soit il existe un atome
ν − µ :p(~t)
dans une
séquene
γ i
telle que0 ≤ i ≤ n
etp
soit publidans
ν
.Nousverronsàlandelasetionsuivante que
−→
préservel'indépendanedelastratégiedeséletiondes
atomes[11℄.
Onsuppose que
call/2 6∈ Σ P
et que!: Σ M F × Σ M
et
!: Σ P F × (Σ P ∪ {call/2})
sont2relationsappeléesdeonversion.Comme
Σ F
,Σ P
etΣ M
sontsupposésêtredistintslesdeuxrelations
! P
et! M
serontutilespour interpréterles symboles de fontionomme des
symbolesdeprédiatetdesidentiantsdemodulelors
d'unméta-appel.Nousétendonsmaintenantlanotion
de programmes PLCM, en autorisant l'utilisation de
call/2
ommesymboledeprédiatdansunbutetdansleotédroitd'unlause.Nousnotonslanouvellelasse
delangageobtenuePLCM
+
.
Dénition2.8(Méta-Transition) Soit
P
un pro-gramme PLCM
+
. La relation de réériture
−→ +
surlesbuts est dénieommela pluspetite relationon-
tenant
−→
etsatisfaisantla règle suivante :S | = ∃(c ∧ t = g ∧ s =f (~x)) f ! P p g ! M µ (c|γ, hν − ν :call(t, s)i , γ ′ ) −→ +
(c, t =g, s =f (~x)|γ, hν − µ :p(~x)i , γ ′ )
Faisonsquelquesremarques:
−→ +
préserve l'indépendane de la stratégie de séletion.Commeunméta-appelnehangepasleontexte
d'appel,
−→ +
préserveaussilemasquagedel'im-plémentation.
Par souide simpliité, la dénition formelle de
call/2
n'autorisepasleméta-appeld'uneonjon-tiond'atomes ni le méta-appel d'uneontrainte.
Cependant,and'émulerlesméta-appelsdeon-
jontions,onpourraitsupposer ('
,
'/2 ! P and/2
)etajouteràl'implémentationdetoutmodule
µ
duprogrammela lause
(and(x, y) ← µ : call(x), µ : call(y)).
Lesméta-appelsde ontraintespeuvent setraiterdemanièreanalogue.Suivant la sémantique donnée, le but
(c| hµ − ν : call(t, s)i)
réussit même si les ar-gumentsdu
call
sontdes variableslibres. Ce astraduit une erreur du programmeur et soulever
une exeption est le plus approprié. Cependant
notre sémantique ne prenant pas en ompte
la notion d'exeption, le hoix du suès sans
instaniation, plutt que l'éhe, est préférable
ar il permet de préserver l'indépendane de
la stratégie de séletion. Cela peut être illustré
par le but suivant : (X=true, all(X)). En
supposantqueleméta-appeld'unevariable libre
éhoue, l'emploi d'une stratégie de séletion
gauhe-à-droite mène à la réponse alulée
X=true tandis qu'une stratégie droite-à-gauhe
nemèneàauuneréponse.
Nous avons l'intention d'exéuter les programmes
modulairessurune mahine abstraiteprohe deelle
de Warren [2℄. Pour montrer que ela est réalisable,
nous proposons ii une tradution formelle des pro-
grammes dePLCM(
S
)versdesprogrammes PLC(S
)pures.
3.1 Compilationdes ProgrammesPLCM
Dans ette setion, noussupposons que
π : (Σ M × Σ P × B) → Σ ′ P
est une une fontion injetive telleque
Σ ′ P
soit disjoint deΣ C
. Ainsi à haque ouple(µ, p)
nous serons apable de faire orrespondre 2 symbolesdeprédiatsappartenantàΣ ′ P
.Lepremier,q ′ = π(µ, p, 0 )
,représenteralaversionprivéedep
dansµ
, alorsque ledeuxième,q ′′ = π(µ, p, 1 )
, représentera la version publiquedep
dansµ
. Nous dénissons i-dessous,unefontiondetradution
Π
desprogrammesPLCM(
S
)verslesprogrammesPLC(S
).Π : µ (ν : p(~t)) = (π(µ, p, (µ 6=ν ∨ p ∈ I µ ))) (~t).
Π
'µ (A 1 , . . . , A n ) = Π µ : (A 1 ), . . . , Π : µ (A n )
Π ← µ (p(~t) ← c|α) = (π(µ, p, (p ∈ I µ ))(~t)) ← c|Π
'µ (α) Π µ ( S
{(A ← c|α)}) = S
Π ← µ (A ← c|α) Π ( S {(µ, D µ , I µ )}) = S {Π µ (D µ )}
Π hi (hµ − Ai) = Π
'µ (A) Π hi ((γ, γ ′ )) = Π hi (γ) , Π hi (γ ′ )
Proposition3.1 (Corretion) Soit
P
et(c|γ)
unprogrammeetunbutPLCM.
(c|γ) −−→ P (d|γ ′ )
= ⇒
(c|Π hi (γ)) −−−→ Π(P) (d|Π hi (γ ′ ))
Lemme 3.2 La fontion de tradution
Π
est inje-tive.
Proposition3.3 (Complétude) Soit
P
et(c|γ)
unprogrammeetunbutPLCM.
si
(c|Π hi (γ)) −−−−→ Π(P ) (d|α))
alors
∃γ ′ .
Π hi (γ ′ ) = α ∧
(c|γ) −−−−→ P (d|γ ′ )
Corollaire3.4
−→
sur les programmes PLCMpréserve l'indépendane par rapport à la stratégie de
3.2 Compilationdes programmesPLCM
+
Nous dénissons maintenant une fontion de tra-
dution
Π +
desprogrammesPLCM(S
)+
verslespro-grammesPLC(
S
)purs.Π + µ (D µ ) = Π µ (D µ ) ∪
( (π(µ, call/2, 0 )) (g, f(~ x)) ← Π : µ (ν, p(~ x))
su has
“ f ! P p ∧ g ! M µ ”
)
Π + ( S
{(µ, D µ , I µ )}) = S
Π + µ (D µ )
3.3 Remarques
La méthode de ompilationprésentée préédem-
mentpermetuneompilationtotalementséparée.
End'autrestermes,ilestpossibledeompilerun
module sans avoir à ompiler (ou préproesser)
le ode d'un autre module. En eet la fontion
Π µ
estdéniesansutiliserlamoindredonnéeex-térieureaumodule
µ
LaompilationdesprogrammesPLCMpurespro-
duit du ode eae.En eetla lauseproduite
par la tradution
Π
est plus simple que son an-téédente : haque ouple (symbole de prédiat
identiant de module) d'un atome qualié est
remplaé par un unique symbole de fontion de
Σ ′ P
.Onpeutaussiremarquerqu'iln'estpasnées-saire de serappeler du ontexted'appel, évitant
ainsitouttest dynamiquedepermission.
D'unpointdevuepratiquelapropriétédulemme
3.2 est intéressantedans leontextedel'analyse
debogues.Puisque
Π
estuneinjetion,nouspou-vonsalulersoninverseet paronséquent,sans
ajouterlamoindreinformationdeompilation,il
estpossible,deretrouverlaposition préisedans
leprogramme originaloùune erreuraété déte-
téependantlaompilation(oul'exéution)desa
tradution.
4 Le Système de Modules d'un point de
vue Pragmatique
En pratique on dispose d'un ensemble d'atomes
omme déni dans ISO Prolog [10℄ . Comme dans
tout système Prolog nous utilisons es atomes pour
représenter les symboles de prédiat et de fontion
ainsi que les identiants de module, la position des
atomes dans les lauses permettant de déterminer à
quel ouplefonteur/aritéilsorrespondent.Ainsiles
deux relations de onversion
! M
et! P
seront lesbi-4.1 CréationdeModules
Un module est un ensemble delauses et de dire-
tivesontenuesdansununiquehier,dontlenomest
identique à l'identiant du module, suivi de l'exten-
sion '.pl'. Ce hier doit ommener par la diretive
module/2 indiquant le nom du module et son inter-
fae.Lenom dumoduleest unatometandisque son
interfaedoit être uneliste despéiationde prédi-
atsouslaforme[Fonteur/Arité|
. . .
℄représentant l'ensemble des prédiats publis du module. L'inter-faepeutêtreremplaéepar_,equiimposequetous
lesprédiatsdumodulesoientpublis.
4.2 Utilisationde Modules
Unmodulepeutêtreutiliséparunautremodule,en
importantunertainsnombrede prédiatspubliset
dediretives.Leprogrammeurpeututiliserunmodule
aumoyendeladiretiveuse_module/2où,lepremier
argumentdoitêtrelenomdumodule utilisé.
4.2.1 ImportdePrédiats
Ledeuxièmeargumentdeladiretivem:use_module
est unelistede laforme[Fonteur/Arité|
. . .
℄indi-quantquelsprédiatsdoiventêtreimportés.Parlebi-
aisdeettediretiveleprogrammeurstipulequetout
prédiatimportédoitêtreonsidéréommeunprédi-
at du module ourant. Par onséquent il est possi-
ble de délarer omme publi (à l'aide de la dire-
tivemodule/2)un prédiatimporté. Andegarantir
lemasquagedel'implémentationd'unmodule utilisé,
seuls les prédiats publispeuvent être importés. De
plus,oninterditl'import deprédiats ayantlemême
fonteuretlamêmearitéqu'unprédiatloalouqu'un
prédiatpréédemmentimporté.
Si le programmeurveututiliser plusieursprédiats
ayant le même nom et la même arité et dénisdans
diérents modules, il doit vérierau préalable qu'au
plusunest importé et utiliserunappelorretement
qualié de la forme Module:p(Arg_1, ..., Arg_n)
pour les autres. Il est également possible d'omettre
ledeuxièmeargumentdeladiretiveuse_module,au
quelasle systèmesuppose quetouslesprédiats du
module utilisédoiventêtreimportés.
4.2.2 ImportdeDiretives
L'utilisation de la diretive use_module/2,impose
queertainesdiretivessoientimportées.C'estnotam-
ment le as des délarations de syntaxes. On peut
noterque,auontrairedel'importdeprédiats,l'im-
Enequionernelesappelslassiquesetlesméta-
appels, les sémantiques proposées dans la setion 2
dénissentlairementlesrèglesdevisibilité de prédi-
ats. Les seuls prédiats qui peuvent être appelés
à partir du module sont les prédiats dénis dans
le module lui même, plus tous les prédiats publis
du programme. Un appel peut être soit un prédiat
qualiéde la formemodule:p(X_1..., X_n)soit un
prédiat non qualié, leompilateur supposant alors
que et appel est impliitement fait à l'intérieur du
module ourant. En d'autres termes, dans le mod-
ule Module le prédiat p(X_1..., X_n) représente
Module:p(X_1..., X_n). Dans le même esprit, le
prédiat all(X) est vue omme un raouri pour
leprédiatall(Module, X).
Pour d'autres traits non modélisés dans notre sé-
mantique (telles que les aès aux variables globales
[9℄,lamanipulationd'attributs[13℄,lesassertionsdy-
namiques de lauses et..), nous proposons une solu-
tionsimplemaisradiale:pardéfautseull'espaede
travail loal (l'espae de travail du module ourant)
est visible. En d'autresmots, l'emploi detelles fon-
tionnalitésnepeutêtrefaitqu'àl'intérieurmêmed'un
module. Paronséquent pour permettre l'aès (an
deonsulter ou modier) aux variables globales,aux
attributsouauxlausesdynamiquesdepuisl'extérieur
d'unmodule,leprogrammeurdoitréerdesprédiats
aesseursdélaréspublis.
Néanmoins, an de failiter la programmation, on
autorise de rendre aessible l'espae de travail de
n'importe quel module en le délarant publi (au
moyen de la diretive publi/0). Le programmeur
utilisera la qualiation an d'aéder à l'espae de
travail d'un module partiulier. Par exemple pour
ajouter dynamiquement une lause dans un module
publi m1 à partir d'un module m2, il emploiera un
appelsouslaformem1:assertz(p(T_1..., T_n).
4.4 ModuleparDéfaut
Notresystème de modules ontientun module par
défaut qui permet la ompilation de hiers Prolog
lassiques(.à.d.sansdélarations relativesauxmod-
ules).Leodedetelshiersestonsidéréommeap-
partenantaumodulespéialuser.Cemoduleeston-
sidéréommepubli,.à.d.qu'auun aèsàemod-
ulen'estontrléparlesystème.Ainsilesystèmepeut
exéuterdesprogrammes ISO-Prolog. Ce module est
aussi le ontexte par défaut de haque appel fait à
Bien que le système de modules que nous avons
déni jusqu'àmaintenantlimite grandementles on-
its de noms de prédiat, son utilisation distribuée
aboutit rapidementàdenouveaux problèmesdeon-
itsdérangeanteuxaussi:lesonitsdenomdemod-
ules. Pour éviter ela, une notion de paquetage simi-
laireaulangageJavaestintroduite.Unpaquetageest
déni ommeune séquened'atomes séparés par des
slashs.Lanotiond'identiantsdemodule estétendue
àsoit des atomes,soit despaires(paquetage, atome)
séparés par un slash. Pour des raisons de onision,
ladiretiveimport/1aétéajoutéeausystème.Grae
à ette dernière il est possible d'importer des noms
de module. Par exemple, l'utilisation de la la dire-
tive :-import(Oefai/lpr)indique au système que
l'atomelprfaitréféreneaumodulelprdupaque-
tageOefai.Demême, parl'intermédiairedupaterne
:-import(Oefai/_)l'utilisateurpourraimportertous
lesnomsdemoduleontenusdanslepaquetageOefai.
Pourévitertoutproblèmed'identiation,l'importde
deux modules de même nom est interdit par le sys-
tème.
4.6 Aproposdel'Implémentation
L'implémentationdenotreprototypedesystèmede
modules,onsisteenuneouheajoutée audessusde
GNU Prolog RH [9℄, version de GNU Prolog éten-
due par lagestion desoroutines et desvariables at-
tribuées.
Cetteouhe,ériteenProlog,estomposée:
d'un préproesseur qui onvertit le ode modu-
laireenodenonmondulaire;
d'unebibliothèquepourlagestiondesappelsdy-
namiques;
d'un nouveau top-level, qui interprète de façon
transparente les programmes modulaires et qui
est apable de ompiler et harger dynamique-
mentdesmoduleset leursdépendanes.
5 Le Problème de l'Ordre Supérieur
Les prinipes de visibilité des prédiats dans les
modules empêhent lamanipulation des prédiatsen
tant que données d'un module à un autre, et inter-
disent donl'utilisation de laméta-programmation à
traverslesystèmedemodules.Suivantlaterminologie
delalittérature,appelonsméta-prédiatslesprédiats
quimanipulentdesméta-données,'est-à-diredesdon-
Soit le prediat forall/2 déni dans le module
lists et vériant que tous les éléments d'une liste
respetentuneertainepropriétépasséeenargument.
forall([℄, P).
forall([H| T℄, P):- G=..[P, H℄,
all(G),
forall(T, P).
Maintenant prenons un prediat toto/1, supposé
être privé dans un autre module. Dans es ondi-
tions l'appel forall([1,2,3℄,toto)éhouera systé-
matiquementet emême silebut Gestorretement
qualié.
5.2 SolutionsExistantes
Dans ette sous-setion, nous proposons un bref
aperçudes systèmesde modules syntaxiquesexistant
etprésentonsommentilstraitentleproblèmedel'or-
dresupérieur.Nousexpliquons,àhaquefoispourquoi
nousn'avonspashoisilessolutionsqu'ilspréonisent.
5.2.1 SolutionNaïve
Pour ontourner le problème présenté préédem-
ment, le programmeur peut délarer omme pub-
li tout prédiat qu'il emploie omme méta-donnée.
D'autre part le méta-prédiat a besoin d'un argu-
mentsupplémentairepourpermettreauprogrammeur
d'indiquerdansquelontextel'appelàlaméta-donnée
doitêtrefait.Cetteméthoderéduitnéanmoinslapro-
tetion du ode, le système n'étant plus apable de
bloquer les appels aux prédiats utilisés en tant que
méta-donnée.
5.2.2 SICStusProlog
DansSICStus[26℄toutprédiatestpubli(formelle-
ment
∀(µ, D µ , I µ )∈ P I µ = Σ P
).Ainsileprogrammeur peut employer la solution naïve proposée i-dessussansavoiradélarerdeprédiatpubli;enontrepar-
tie, e système ne fournit auune sortede protetion
du ode. Grâe à la diretive meta_prediate, qui
permet de délarer expliitement les méta-prédiats,
lesystèmeestapabled'ajouterimpliitementleon-
texte d'appel aux méta-données. Le prinipal défaut
de ette approhe est ependant l'abandon de toute
formedeprotetiondesaès auxprédiats.
5.2.3 ECLiPSe
ECLiPSe[1℄proposeunesolutionintermédiaire.En
all/2 (déni à la setion 2.3) alors que le deux-
ième/2 nefait auuntest depermission.Il fournit,
aussi, une diretive tool/1,(analogue à la diretive
meta_prediate de SICStus) qui permet d'ajouter
impliitement le ontexte d'appel omme argument
supplémentaireduméta-prédiat.Ainsipouruneutil-
isationourante,leprogrammeuremploie:/2,tandis
qu'il utilise /2 quand il onçoit des méta-prédiats.
Cette solution al'avantage de limiter les appels non
autorisés, faits de manière inonsiente. Néanmoins,
omme dans le as préédent, il est impossible d'as-
surerlemasquaged'unprédiat. Ilestànoterque la
solutionemployéepar ECLiPSe est très prohe de la
propositionISO[16℄.
5.2.4 SWIProlog
Pour la méta-programmation SWI-Prolog [28℄,
utilise unesémantiquequelque peu diérente deelle
que nous avons proposée àla setion2. En fait SWI
manipule deux ontextes d'appel distints. Le pre-
mier, que nous appelons ontexte statique joue le
rle de ontexte d'appel dans la règle dénie à la
la setion 2.2. Le deuxième que nous appelons on-
textedynamique jouelerle deontexted'appeldans
la règle de méta-transition dénie à la setion 2.3.
Par défaut le ontexte dynamique est le même que
le ontexte statique. Pour un méta-prédiat epen-
dant,leontextedynamiqueestleontextedynamique
du but qui l'a appelé. Dans SWI-Prolog, les prédi-
atsayantuntelomportementsontappelés module
transparent et sont délarés à l'aide de la diretive
module_transparent/1. Ave un tel omportement,
etendélarantforall/2ommeunprédiatmodule
transparent,SWI-Prologexéutel'exemplepréédant
ommeonlesouhaite.
Néanmoins un appel dynamique ne se omporte
pas ommeun appelstatique. Par exemple, dans un
prédiatmoduletransparent,lesdeuxbutsp(X)et
(G=p(X), all(G))n'appellentpasp/1danslemême
module (le premier fait l'appel dans le ontexte sta-
tique tandis que le deuxième lefait dans leontexte
dynamique). De plus, il ne fournit pas une prote-
tionduodeaussiimportantequenouslesouhaitons.
Parexemple,ladénitiondefindall/2delasetion
2.1 ne fontionne pas mieux en SWI, toutes les as-
sertions/rétrations étant faites ette fois i dans le
module appelantaulieudumoduleappelé.
5.2.5 CIAO Prolog
Coneptuellement,CIAOProlog[4℄adopte,unsys-
tème de modules fermé. Pour permettre la manipu-
deladiretivemeta-prediate/1.Avantl'appelaux
méta-prédiats,lesystèmeompileàlavolée,laméta-
donnée en utilisant une méthode analogue à elle
dénieàlasetion3.1. Puisque etteompilationest
faite avant l'appel au méta-prédiat, le système est
apablesansproblème deonnaître leontexte d'ap-
peldanslequeldoitêtreappelélaméta-donnée,pour
obtenirunrésultat analogueàelui qui est souhaité.
Leméta-prédiatmanipulealorsuneversionompilée
delaméta-donnéesqu'ilestpossibled'exéuteràl'aide
duprédiatall/1.Commelesystèmenefournitau-
unprédiat(hormisall/1)apabledemanipulerou
réeruneversionompiléedeméta-donnée,ilpréserve
lemasquagedel'implémentation.
Bien que ela ne soit pas lairement énoné dans
son manuel, pour ontourner le problème de l'ordre
supérieur,CIAOPrologfait donune distintion en-
trelestermes et lesobjetsd'ordresupérieur(lesver-
sions ompilées de but). Cependant es objets d'or-
dre supérieur ne sont pas expliitement des itoyens
de première lasse du langage. Nous préférerons une
autresolutionquineahepasesobjetsderrièreune
diretive.
5.2.6 XSB
Le système XSB [23℄, qui est lui aussi onsidéré
ommeunsystèmesyntaxique, suitune approheas-
sezdiérentesdessystèmespréédents.Eneet,ilfait
partiedelalassesdessystèmesfondéssurlesatomes,
auontrairedespréédentsquisonteuxfondéssurles
prédiats.La prinipalediérene est queXSB mod-
ulariseaussilessymboles defontion.Ainsideux ter-
messtruturésonstruitsdansdeuxmodulesdiérents
nepourrontpas, pardéfaut, êtreuniés.Ilest toute-
fois possible d'importer, dans un module, des sym-
boles publis d'un autre module, le système onsid-
érant alors que les modules partagent es symboles.
Lasémantiqueduallestalorstrèssimple,leméta-
appeld'un termeorrespondàl'appelauprédiat de
mêmesymbole etmême arité,dumodule oùleterme
aétéréé.
Cette solution ne fait ependant que déplaer le
problème sur la onstrution dynamique de termes.
En eet, dans XSB les termes onstruits àl'aide de
=../2,funtor/3 et read/1sont tous supposés ap-
partenir au module spéial user. Le système ne re-
spetealorspasl'indépendanedelastratégiedeséle-
tion(parexemple, dans unmodule distint deuser,
(funtor(X,toto,1), X=toto(_)) éhouealors que
Nousintroduisonsdanslelangagedesobjetsd'ordre
supérieur,quenousappelonsfermetures.Anderéer
etmanipulerdetellesdonnées,nousavonsajoutédeux
nouveauxopérateurslosure/3etapply/2.L'expres-
sionlosure(X, G, C)unieCavelafermetureon-
struiteàpartirdubutGdanslequellavariableXaété
abstraite, tandis que apply(C, T) substitue dans la
fermetureClavariabled'abstrationparletermeTet
exéutelebutobtenu.
Il faut noter qu'unefermeture ne peut être uniée
qu'avedesvariableslibres.Deplusilestimportantde
bien omprendrequelosure/3est unnouvelopéra-
teuret passimplementunprédiat,notammentpare
qu'ilsupposed'unepartqueGsoitunbut(etpasune
variable)àlaompilation,etd'autrepartquelavari-
abled'abstrationsoitlibredanslerestedelalause.
Cen'estpasleasd'apply/2quipeutêtrevuomme
unprédiatprédéni.
Exemple 2. Pour illustrer l'utilisation des ferme-
tures,réérivonsl'exemplepréédent:
forall([℄, C).
forall([H| T℄, C):- apply(C, H),
forall(T, P).
Cettefois-i,même sitoto/1est unprediatprivé
d'unautremodule,l'appelàlosure(X,toto(X),Z),
forall([1,2,3℄,Z)seomporteraommeattendu.
Exemple 3. De plus les fermetures nous permet-
tentdedénirunnouvelleimplémentationdufindall
garantissantlaprotetionduode.
findall(C, _) :- apply(C, X),
asserta(found(X)),
fail.
findall(C, L) :- ollet([℄, L)
Par exemple les lauses retirées par l'appel
losure(X,retrat(found(X)),Z), findall(C,L)
seront retiréesproprementdans lemodule appellant,
et nonpasdanslemodule dedénitiondufindall.
Cettesolutionprésenteplusieursavantages:
Dans une fermeture, il n'y a auun test de per-
missiondynamiqueaeetuer,arleprédiatest
onnuàlaompilation
lesfermeturespeuventêtreompiléesdefaçonef-
ae,arlesystèmesait àlaompilationquele
deuxièmeargumentdel'opérateurlosureestun
l'entrée et la sortie de l'appel (.à.d. qu'il n'y a
pas de onversion dynamique de données avant
l'invoationd'unméta-prédiat).
Comme le montre l'annexe A, losure/3 et
apply/2ontuneimplantationsimpleenprogram-
mationonurrentelinéaireaveontraintes.
Parmitouteslesfermeturesqui peuventêtreréées
àpartirdulangage,onpeutendistingueruneparti-
ulièrementintéressantedansleontexted'unsystème
demodulesfermé.Cettefermeture,quenousappelons
délégation,estl'abstrationdeall/1,.à.d.laferme-
ture Delegationobtenuepar appliation de l'opéra-
tion losure(X, all(X), Delegation). Grâe à
ette onstrution unmodule peutrendre aessible,
de façonexpliite,son espaedetravailà unmodule
tiers. Parexempleen réant dansun module m1une
délégationDelegation et en lapassantà unmodule
m2(parl'intermédiaired'unprédiatpublidem2),le
module m2est apable d'exéutern'importequel but
G dans l'espae de travail de m1 à l'aide de l'appel
apply(Delegation, G).
Ainsi grâe à la ombinaison de la méta-
programmation et des fermetures, le langage obtenu
estassezexpressifpourpermettreauprogrammeurde
mettre en plae diérentes politiques de modules. Il
peuthoisir:
Unepolitiqueouverte,àlaSICStus,oùl'espae
de travail dumodule sera visible del'extérieur :
pourelailsutdedélarerlemodulepubli.
Une politique fermée, où le module sera vu de
l'extérieurommeuneboîtenoire: enn'utilisant
auunefermeture.
Une politiqueintermédiaire, oùertainsmodules
aurontaèsàl'espaedetravailetertainsautres
non:enpassant,expliitementunedélégationaux
modules que qui pourront aéder à l'espae de
travail.
6 Conlusion
Dans son artile [27℄, Warren ritiquait les exten-
sionsdePrologpardesméanismesd'ordresupérieur
(etnotammentlesfermetures).Ilmontre,eneet,que
le langage obtenu, n'estpas réellementplus expressif
qu'un Prolog ave méta-programmationseule. Même
sinousneremettonspasenauseetteargumentation
dans le adre d'un système sansmodule,nous avons
montré que e n'était plus le as dans le adre d'un
système modulairefermé.
Lesystème demodulesquenousavonsproposéest
prohe de eluide CIAO Prolog,dans son implanta-
ats de méta-programmation dans le adre d'un sé-
mantiqueformelle.
Comme preuve duonept, le système de modules
aétéimplantéenGNU-Prologetplusieursdéveloppe-
ments de bibliothèques ontété réalisésdans l'équipe
àpartirdela versionmodulaire deGNU PrologRH,
pourledéveloppementdeSiLCC.Onpeutiter,entre
autres, un lexeur-analyseursyntaxique onçu par De
Rauglaudrepermettantdesextensionsdesyntaxeplus
généralesquelatraditionnelle diretiveop/3,et rela-
tives aux modules. Cette bibliothèque fait partie du
bootstrapdulangage SiLCC.Parailleurs,le portage
par Bouissou de la librairie CHR de Shrijvers four-
nit un exemple d'utilisation intensive du système de
modules.
Remeriements
Noustenons àremerierSumit Kumarpourletra-
vail préliminaire qu'il a réalisé sur le sujet pendant
son stage à l'INRIA durant l'été 2003. Nous remer-
ions également Emmanuel Coquery et Sylvain Soli-
man pour lesdisussions frutueuses que nous avons
eues ensemble sur e sujet. Nous sommes aussi re-
onnaissants envers Daniel de Rauglaudre et Olivier
Bouissou pour les ommentaires qu'ils nous ont ap-
portéssurl'implantationréalisée.
Référenes
[1℄ Abderrahamane Aggoun and al. ECLiPSe User
ManualRelease5.2,19932001.
[2℄ Hassan Aït-Kai. Warren's Abstrat Mahine,
A Tutorial Reonstrution. Logi Programming.
MITPress,1991.
[3℄ A. Brogi, P. Manarella, D. Pedreshi, and
F.Turini. Metaformodularising logiprogram-
ming. InMETA-92 : Third International Work-
shopon MetaProgramming inLogi,pages105
119,Berlin,Heidelberg,1992.Springer-Verlag.
[4℄ F. Bueno, D. Cabeza Gras, M. Carro, M. V.
Hermenegildo, P. Lopez-Gara, and G. Puebla.
TheiaoPrologsystem.referenemanual. Teh-
nial Report CLIP 3/97-1.10#5, University of
Madrid,1997-2004.
[5℄ Daniel Cabeza. An Extensible, Global Analysis
FriendlyLogiProgrammingSystem.PhDthesis,
UniversidadPoliténiadeMadrid,August2004.
[6℄ DanielCabezaandManuelHermenegildo.Anew
modulesystemforProlog. InFirstInternational
2000.
[7℄ Weidong Chen. A theory of modules based on
seond-order logi. In The fourth IEEE. Inter-
natal Symposium on Logi Programming, pages
2433,1987.
[8℄ Daniel Diaz and Philipe Codognet. Design and
implementationoftheGNUPrologsystem.Jour-
nalof Funtional andLogiProgramming,6,O-
tober2001.
[9℄ Daniel Diaz and Rémy Haemmerlé. GNU Pro-
logRH user'smanual,19992004.
[10℄ PierreDeransartAdbelali.Ed-DbaliandLaurent.
Cervoni. Prolog:TheStandard.Springer-Verlag,
NewYork,1996.
[11℄ FrançoisFages.ProgrammationLogiqueparCon-
traintes. Colletion Cours de l'Eole Polyteh-
nique. Ed.Ellipses, Paris(192p),1996.
[12℄ FrançoisFages,PaulRuet,and SylvainSoliman.
Linear onurrent onstraintprogramming : op-
erationaland phase semantis. Information and
Computation, 165(1):1441,February2001.
[13℄ C. Holzbaur. Metastrutures vs. attributed
variables in the ontext of extensible unia-
tion. Rapport TehniqueTR-92-23, Österreihi-
shes Forshungsinstitut für Artiial Intelli-
gene,Wien,1992.
[14℄ C. Holzbaur. Oefai lp(q,r) manual rev.
1.3.2. Tehnial Report TR-95-09, Österreihi-
shes Forshungsinstitut für Artiial Intelli-
gene,Wien,1995.
[15℄ International Organization for Standardiztion.
InformationtehnologyProgramminglanguages
PrologPart1:General ore,1995. ISO/IEC
13211-2:1995.
[16℄ International Organization for Standardiztion.
InformationtehnologyProgramminglanguages
Prolog Part 2 : Modules, 2000. ISO/IEC
13211-2:2000.
[17℄ Joxan Jaar and Jean-Louis Lassez. Constraint
logi programming. In Proeedings of the 14th
ACM Symposium on Priniples of Programming
Languages, Munih, Germany, pages 111119.
ACM,January1987.
[18℄ XavierLeroy.Amodularmodulesystem.Journal
ofFuntionalProgramming,10(3):269303,2000.
[19℄ Dale Miller. A logial analysis of modules in
logi programming. Journal of Logi Program-
ming, pages79108,1989.
[20℄ Luís Monterio and António Porto. Contex-
Programming,pages284299,1989.
[21℄ Paulo Moura. Logtalk - Design of an Objet-
Oriented Logi Programming Language. PhD
thesis, Departmentof Informatis, University of
BeiraInterior,Portugal,September2003.
[22℄ RihardA.O'Keefe.Towardsanalgebraforons-
truting logiprograms. InSymposium on Logi
Programming,pages152160.IEEE,1985.
[23℄ Konstantinos Sagonasand al. The XSB System
Version 2.5- Volume1 :Programmer'sManual,
19932003.
[24℄ D.T.SannellaandL.A.Wallen.aalulusforthe
onstrutionof modularPrologprograms. Jour-
nalof Logi Programming,pages147177,1992.
[25℄ TomShrijversandDavidS.Warren. Constraint
handlingrulesandtableexeution.InProeedings
of ICLP'04, International Conferene on Logi
Programming, pages 120136, Saint-Malo, 2004.
Springer-Verlag.
[26℄ SwedishInstitute of ComputerSiene. SICStus
Prologv3User'sManual.TheIntelligentSystems
Laboratory, PO Box1263, S-16428 Kista, Swe-
den,19912004.
[27℄ David H. D. Warren. Higher-orderextensionsto
Prolog : Are they needed? In Mahine Intelli-
gene, volume 10of LetureNotes in Mathemat-
is,pages441454.1982.
[28℄ Jan Wielemaker. SWI Prolog 5.4.1 Referene
Manual,19902004.
A Fermeture en LCC
Nous proposons ii une dénition de
closure/3
etapply/3
dans la programmation onurrente linéaire aveontraintes(LCC).En faitesdeuxonstrutionpeuventêtre vu simplement ommedu sure syntax-
ique:
closure(x, A, z) ≡ !∀x.((arg(z, x)) → A) apply(t, z) ≡ arg(z, t)
DanslaLCC,pardénitionleotédoitdel'opérateur
ask(.à.d.
→
)doitêtreunagent(la notiond'agentestéquivalentàelledebutdanslaLCC),ainsi
A
doittoujoursêtreinstaniéàlaompilation.