• Aucun résultat trouvé

Un Système de Module Fermé pour la PLC

N/A
N/A
Protected

Academic year: 2021

Partager "Un Système de Module Fermé pour la PLC"

Copied!
11
0
0

Texte intégral

(1)

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�

(2)

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

(3)

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

(4)

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, les

A i

sont

desatomesetles

µ i

'ssontdesidentiantsdemodules.

Dans la suite, nous appellerons atomes qualiés les

(µ i : A i )

etune lause seranotée de façononise par

A ← c|α

.

Dénition 2.2(Module) Unmoduleestun

n

-uplet

(µ, D µ , I µ )

µ ∈ Σ 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 un

symbole

p

appartientàl'interfaed'unmodule

µ

,nous

dirons que

p

estpublidans

µ

.

Dénition 2.3(Programme) Un programme

PLCM

P

est unensemble de modules dont les noms

sont 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 programme

PLCM. La relation de réériture

−→

sur les buts

est 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 i

traduit le fait que

µ : p(~t)

ne peut être exéuté que

si l'appel est fait àpartir duontexte

µ

ou quesi le

prédiat

p

estpublidanslemodule

µ

.

Lemme2.6 Si

(c|γ) −→ (d|γ , hν − Ai , γ ′′ )

est une

transition alors il existe un atome ave ontexte

µ − µ : p( ~t)

dansla séquene

γ

telque :

soit

ν = µ = µ

,

soit

ν = µ

et

p

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 que

0 ≤ i ≤ n

et

p

soit publi

dans

ν

.

Nousverronsàlandelasetionsuivante que

−→

préservel'indépendanedelastratégiedeséletiondes

atomes[11℄.

(5)

Onsuppose que

call/2 6∈ Σ P

et que

!: Σ M F × Σ M

et

!: Σ P F × (Σ P ∪ {call/2})

sont2relationsappelées

deonversion.Comme

Σ F

,

Σ P

et

Σ M

sontsupposés

êtredistintslesdeuxrelations

! P

et

! M

serontutiles

pour 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édiatdansunbutetdans

leotédroitd'unlause.Nousnotonslanouvellelasse

delangageobtenuePLCM

+

.

Dénition2.8(Méta-Transition) Soit

P

un pro-

gramme PLCM

+

. La relation de réériture

−→ +

sur

lesbuts 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

µ

du

programmela 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 as

traduit 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 telle

que

Σ 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éede

p

dans

µ

, alorsque ledeuxième,

q ′′ = π(µ, p, 1 )

, représentera la version publiquede

p

dans

µ

. Nous dénissons i-

dessous,unefontiondetradution

Π

desprogrammes

PLCM(

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|γ)

un

programmeetunbutPLCM.

(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|γ)

un

programmeetunbutPLCM.

si

(c|Π hi (γ)) −−−−→ Π(P ) (d|α))

alors

∃γ .

Π hi ) = α ∧

(c|γ) −−−−→ P (d|γ )

Corollaire3.4

−→

sur les programmes PLCM

préserve l'indépendane par rapport à la stratégie de

(6)

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-

(7)

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-

(8)

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-dessus

sansavoiradé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-

(9)

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

(10)

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

(11)

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

et

apply/3

dans la programmation onurrente linéaire aveontraintes(LCC).En faitesdeuxonstrution

peuventê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'agent

estéquivalentàelledebutdanslaLCC),ainsi

A

doit

toujoursêtreinstaniéàlaompilation.

Références

Documents relatifs

Des instructions pour l'installation du système d'exploitation Solaris 5/08 à partir du disque d'initialisation sont fournies dans le Guide d'installation du module serveur Sun

En l‘occurrence, elles sont représentées soit dans des formats textuels lisibles et accessibles par un non-informaticien (comme pour les dictionnaires et les fichiers des

iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT iptables-A INPUT -p ICMP --icmp-type 11 -j ACCEPT groupe de règles No 3 (quelle différence avec le groupe 2 ?):.. iptables

• Comprendre le rôle de dispositifs de protection contre les risques du courant

Mentions de danger (CLP) : H412 - Nocif pour les organismes aquatiques, entraîne des effets néfastes à long terme Conseils de prudence (CLP) : P273 - Éviter le rejet

Isoler les systèmes suivant et, pour chaque système, vous listerez les actions mécaniques extérieures qui agissent dessus et vous en préciserez les points d’application,

On considère la réaction totale d’oxydation de l’ammoniac par le dioxygène qui donne du diazote et de la vapeur d’eau. Tous les corps sont gazeux et le mélange initial comporte

1) Classer les paramètres d’état suivants en deux catégories : paramètre intensif et extensif. 2) Considérons un système siège d’une unique réaction dont l’équation bilan s’écrit