5i' D.5.4 Directives applicables a la representation en fonc- tion des etats et aux elements graphiques Le present paragraphe decrit la representation en fonction des etats du LDS/GR et des elements graphiques utilises. Le S D.5.4.1 contient des observations d'ordre general sur la representation en fonction des etats: caracteristiques, applica- tions pertinentes et variantes. Le S D.5.4.2 explique la description d'etats au moyen d'elements graphiques. D.5.4.1 Observations d'ordre general sur la representation en fonction des etats Le LDS/GR offre trois versions differentes pour decrire un diagramme de processus. La premiere est appelee version du LDS/GR en fonction des transitions, dans laquelle les transitions sont decrites exclusive- ment par des symboles d'action explicites. La seconde est appelee version du LDS/GR orientee vers les etats ou extension graphique du LDS orientee vers les etats; les etats d'un processus y sont decrits a l'aide d'illustrations d'etats et les transitions ne sont donnees qu'implicitement, par les differences entre les etats de depart et d'arrivee. La derniere est appelee version mixte; il s'agit d'une com- binaison des deux versions precedentes. On trouvera des exemples de ces trois versions dans l'annexe E du present fascicule. La version orientee vers les transitions convient lorsque la sequence des actions presente plus d'importance que la description detaillee des etats. La version orientee vers les etats decrit en detail les etats par des enonces; elle convient donc au cas ou un etat de processus presente plus d'importance que la sequence des actions a l'interieur de chaque transition, alors que l'explication graphique intuitive est souhaitable et qu'il est interessant de conna | tre les ressources ainsi que leurs relations avec les etats. Les illustrations d'etat sont generalement exprimees par des elements graphiques indiquant les ressources pertinentes de l'etat en cours du processus. Cette version convient a des applications dans lesquelles sont definis des elements graphiques appropries; l'utilisateur peut donc employer cette representation pour n'importe quelle application en definissant des elements graphiques appropries selon les besoins. La version mixte convient lorsqu'il faut conna | tre a la fois la sequence des actions interieures a chaque transition et les descriptions detaillees des etats. D.5.4.2 Illustration d'etat et element graphique D.5.4.2.1 Element graphique et texte qualificatif Si l'on a choisi l'option illustration d'etat, celle-ci se compose d'elements graphiques et d'un texte qualificatif, comme indique dans la figure D-5.4.1 a) a D-5.4.1 d). Cette combinaison rend comprehensibles les illustrations d'etat. A titre d'exemple, la figure D-5.4.1 a) donne la significa- tion d'un recepteur a cadran manipule par le processus, l'exemple b) celle d'un emetteur de tonalite de numerotation emet- tant un signal permanent vers l'environnement. A noter que les signaux de sortie (signaux non permanents) et les ressources pertinentes ne sont pas decrits dans les illustra- tions d'etat; les signaux de sortie peuvent | tre decrits dans un diagramme de transition. L'exemple c) montre un temporisateur dont l'expiration est toujours representee par une entree. A noter que l'illustration graphique recommandee pour le temporisateur comporte le signal d'entree pertinent t1. Le dernier exemple, d), signifie qu'un enregistreur de mes- sages vocaux est en cours de fonctionnement. L'identite de la ressource peut | tre considerablement abregee et devrait, si possible, | tre placee a l'interieur de l'illustration graphique appropriee. Ainsi, les elements graphiques qui sont qualifies sont tout a fait evidents. D.5.4.2.2 Illustrations d'etat completes Chaque illustration d'etat doit comporter un nombre suffisant d'elements graphiques afin de montrer: a) quelles ressources le processus met en oeuvre au cours de l'etat represente. Exemples: trajets de commutation, recepteurs de signalisation, emetteurs de signaux permanents et modules de commutation; b) s'il y a en ce moment un ou plusieurs temporisa- teurs qui contr | lent le processus; c) dans le cas ou le processus concerne le traite- ment des appels, si la taxation est ou non actuellement en cours et quels abonnes sont taxes au cours de cette phase de l'appel; d) quels objets appartenant effectivement a un autre processus (environnement) sont consideres comme en relation avec des ressources du processus pendant l'etat en cours; e) les signaux permanents de sortie qui sont emis dans cet etat; f ) la relation entre les signaux et ressources existants dans l'etat; g) l'inventaire des ressources concernant l'etat en cours du processus. Figura D-5.4.1, (N), p. 1 D.5.4.2.3 Exemple A titre d'exemple d'application des principes exposes ci-dessus, considerons l'etat de la figure D-5.4.2. On peut voir que, dans cet etat: a) les ressources affectees aux processus sont: un recepteur de chiffres a cadran, un emetteur de tonalites de numerotation, un poste d'abonne appartenant a l'environnement et des trajets de communication reliant ces organes; b) un temporisateur t0 surveille le processus; c) aucune taxation n'est en cours; d) l'abonne est identifie comme l'abonne A mais aucune autre information de categorie n'est prise en consideration; e) les signaux d'entree suivants sont attendus: A _on _hook (A raccroche), digit (chiffre) (chiffre numerote) et t0 (le temporisateur de supervision t0 fonctionne); f ) le signal permanent de sortie DT (tonalite de numerotation) a ete mis avant cet etat et pendant celui-ci. Figure D-5.4.2, (N), p. 2 D.5.4.2.4 Verification de la coherence de diagrammes LDS avec elements graphiques On constate que l'illustration d'etat est plus compacte et que, d'une certaine maniere, elle offre au lecteur plus d'informations; cependant, l'identification de la serie exacte d'operations accomplies au cours de la transition exige un examen tres attentif des ressources. En outre, une simple observation de l'illustration d'etat ne permet pas de determiner l'ordre des actions dans la transition. Les elements graphiques representes a l'exterieur du bloc sont des elements qui ne sont pas directement commandes par le processus donne: ceux qui sont representes a l'interieur du symbole <> sont directement commandes par ce processus. Par exemple, le processus d'appel partiellement specifie dans la figure D-5.4.3 peut allouer ou liberer l'emetteur de tonalite d'appel, l'emetteur de sonnerie et les trajets de conversation; il peut egalement declencher ou arr | ter le temporisateur T4, mais il ne peut com- mander directement la condition du combine de l'abonne. En concevant la logique a partir d'une specification LDS avec elements graphiques, seuls les elements graphiques representes a l'interieur des limites du bloc ont une influence sur les actions executees pendant les sequences de la transition. Les elements gra- phiques complexes representes a l'interieur des limites de ce bloc sont normalement inlus dans une illustration d'etat: a) soit parce qu'ils indiquent les ressources et l'etat de l'environnement concernes par le signal d'entree du pro- cessus pendant l'etat donne; b) soit pour ameliorer l'intelligibilite du diagramme. D.5.4.2.5 Utilisation du symbole <> Que l'on emploie ou non des elements graphiques, l'expiration d'un delai de temporisation est toujours representee par une entree. La presence d'un symbole de temporisateur dans une illustra- tion d'etat implique qu'un temporisateur fonctionne pendant cet etat. Figure D-5.4.3, (N), p. 3 Conformement au principe general expose dans les Recommanda- tions, le demarrage, l'arr | t, le redemarrage et l'expiration du temporisateur sont representes a l'aide d'elements graphiques de la maniere suivante: a) pour montrer qu'une temporisation commence au cours d'une transition donnee, le symbole temporisateur doit appara | tre sur l'illustration d'etat qui correspond a la fin de cette transition et non sur celle qui correspond a son debut; b) inversement, pour montrer qu'une temporisation s'arr | te au cours d'une transition, le symbole temporisateur doit appara | tre sur l'illustration d'etat qui correspond au debut de cette transition et non sur celle qui correspond a sa fin; c) pour montrer qu'une temporisation est relancee au cours d'une transition un symbole explicite de t | che doit | tre represente dans cette transition (on en voit deux exemples sur la figure D-5.4.4); d) l'expiration du delai d'une temporisation donnee est representee par un symbole d'entree associe a un etat dont l'illustration porte le symbole <> correspondant. Il peut naturellement arriver que plusieurs temporisateurs surveillent a la fois le m | me processus (voir la figure D-5.4.5). Figure D-5.4.4, (N), p. 4 Figure D-5.4.5, (N), p. 5 D.5.5 Diagrammes auxiliaires Pour faciliter la lecture et la comprehension de diagrammes de processus de grande taille et/ou complexes, l'auteur peut y ajouter des diagrammes auxiliaires informels. De tels documents ont pour but de donner une description synoptique ou simplifiee du comporte- ment du processus (ou d'une partie de celui-ci). Les documents aux- iliaires ne remplacent pas les documents en LDS mais constituent une introduction a ceux-ci. On trouvera dans la presente section des exemples de certains diagrammes auxiliaires couramment utilises, notamment des diagrammes synoptiques d'etat, des matrices etat/signal, et des diagrammes de sequencement. (Le diagramme en arbre de bloc decrit au S D.4.4 est egalement un diagramme auxiliaire.) D.5.5.1 Diagramme synoptique d'etat Son objectif est de donner une vue d'ensemble des etats d'un processus, et d'indiquer quelles transitions sont possibles entre eux. Etant donne qu'il s'agit de donner un apercu, l'on peut negliger les etats ou les transitions de peu d'importance. Les diagrammes se composent de symboles d'etat, de fleches representant des transitions et, eventuellement, de symboles de debut et d'arr | t. Le symbole d'etat doit indiquer le nom de l'etat reference. Plusieurs noms d'etat peuvent | tre inscrits dans le symbole, et il est possible d'employer un asterisque (*) pour designer tous les etats. Chacune des fleches peut, de m | me que chacune des sorties possibles pendant la transition, | tre associee au nom du signal ou de l'ensemble de signaux qui declenchent la transition. On trouvera dans la figure D-5.5.1 un exemple de diagramme synoptique d'etat. Figure D-5.5.1, (MC), p. 6 Il est possible de repartir sur plusieurs diagrammes le diagramme synoptique d'etat d'un processus; chacun des diagrammes obtenus porte alors sur un aspect particulier, comme <>, traitement en cas de defaillance, etc. Figure D-5.5.2, (N), p. 7 D.5.5.2 Matrice etat/signal La matrice etat/signal doit servir de document <> a un diagramme de processus important. Elle indique les endroits ou existent des combinaisons entre un etat et un signal dans le diagramme. Le diagramme se compose d'une matrice bidimensionnelle; celle-ci presente sur un axe tous les etats d'un processus, et sur l'autre tous les signaux d'entree valides d'un processus. L'etat suivant est donne pour chaque element de matrice, de m | me que les sorties possibles au cours de la transition. Une reference peut | tre indiquee pour permettre de trouver la combinaison donnee par les indices, si elle existe. L'element correspondant a l'etat fictif ou <> et au signal fictif <> sert a indiquer l'etat initial du pro- cessus. Figure D-5.5.3, (MC), p. 8 Il est possible de fractionner la matrice en sous-parties reparties sur plusieurs pages. Les references sont celles qu'emploie normalement l'usager dans la documentation. Les signaux et les etats doivent | tre de preference regroupes de facon que chaque partie de la matrice porte sur un aspect particulier du comportement du processus. D.5.5.3 Diagramme de sequencement Le diagramme de sequencement peut servir a montrer l'echange des sequences de signaux autorisees entre un ou plusieurs processus et leur environnement. Ce diagramme doit donner une vue d'ensemble de l'echange de signaux entre les parties du systeme. Ce diagramme peut representer l'ensemble ou une partie de l'echange de signaux, en fonction des aspects a mettre en evidence. Les colonnes du diagramme indiquent les entites en communica- tion (services, processus, blocs ou l'environnement). Leurs interactions sont illustrees par un ensemble de lignes flechees, dont chacune represente un signal ou un ensemble de sig- naux. Figure D-5.5.4, (N), p. 9 On peut annoter chaque sequence afin de faire appara | tre clairement l'ensemble d'informations echangees. Chaque ligne est accompagnee d'une annotation qui donne les renseignements requis (noms des signaux ou de procedures). On peut placer un symbole de decision dans les colonnes pour indiquer que la sequence suivante est valide si la condition indiquee est vraie. Dans ce cas, le symbole de decision appara | t generalement plusieurs fois; il indique les differentes sequences produites par chacune des valeurs de la condition. Ce diagramme peut representer la totalite ou seulement un sous-ensemble significatif des sequences de signaux echanges. La representation de l'interaction reciproque des services resultant de la subdivision d'un processus represente une applica- tion utile de ce type de diagramme. Les diagrammes de sequencement ne comprennent generalement pas toutes les sequences possibles; ils constituent souvent un prealable a la definition complete. D.6 Definition des donnees en LDS D.6.1 Directives applicables aux donnees en LDS On trouvera dans la presente section des renseignements complementaires sur les concepts definis au S 5 de la Recommanda- tion concernant le LDS. La principale difference entre la presente section et l'ancienne Recommandation Z.104 est que cette derniere a fait l'objet d'une revision a des fins de clarification et d'harmonisation avec l'ISO. Certains des mots cles ont ete modifies et des adjonctions ont ete faites mais la coherence de la semantique a ete assuree avec le Livre rouge. L'emploi des donnees decrites aux S 2, 3 et 4 de la nouvelle Recommandation (auparavant Z.101-Z.103) est reste tel quel. D.6.1.1 Introduction generale Les types de donnees du LDS sont fondes sur l'approche de <>: on ne decrit pas la maniere dont un type doit | tre mis en oeuvre, mais on se borne a dire quel sera le resultat des operateurs applique aux valeurs. Lorsque l'on definit des donnees abstraites, chaque segment de la definition, appelee <> est intro- duit par le mot-cle NEWTYPE. Chaque definition de type partielle a une incidence sur les autres, de sorte que toutes les definitions de type partielles au niveau du systeme constituent une definition de type de donnees unique. Si plusieurs definitions de type par- tielles sont introduites a un niveau inferieur (niveau de bloc, par exemple), leur ensemble constitue, avec les definitions de niveau superieur, une definition de type de donnees. Cela signifie qu'en un point quelconque de la specification, il n'existe qu'une seule definition de type de donnees. En substance, la definition de type de donnees comprend trois parties: a) definitions de sortes; b) definitions d'operateurs; c) equations. Chacune de ces parties fait l'objet d'explications dans les paragraphes qui suivent. La definition de type de donnees est structuree en definitions de type de donnees partielles, chacune introduisant une sorte. Les definitions d'operateurs et les equa- tions recouvrent les definitions de type de donnees partielles. D.6.1.2 Sortes Une sorte est un ensemble de valeurs qui peut avoir un nombre fini ou infini d'elements mais ne peut | tre vide. Exemples: a) l'ensemble de valeurs de la sorte booleenne est { rue (vrai), False (faux } b) l'ensemble de valeurs de la sorte Natural (naturel) est l'ensemble infini des nombres naturesls { , 1, 2, . | } c) l'ensemble de valeurs de la sorte Couleur _pri- maire est { ert, Rouge, Ble } Tous les elements d'une sorte ne doivent pas | tre directe- ment fournis par l'utilisateur (cela exigerait un temps infini dans le cas des nombres naturels), mais le nom de la sorte doit | tre indique. Dans la syntaxe concrete, le mot-cle NEWTYPE est directe- ment suivi par le nom de la sorte (certaines autres possibilites seront indiquees plus loin). Ce nom est surtout utilise dans les definitions d'operateurs, comme explique au S D.6.1.3, et dans les declarations de variables. D.6.1.3 Operateurs, litteraux et termes Les valeurs d'une sorte peuvent | tre definies de trois manieres: a) par une enumeration: les valeurs sont definies dans la section des litteraux; b) par des operateurs: les valeurs sont donnees comme les resultats d'<> d'operateurs; c) par une combinaison d'enumerations et d'operateurs. La combinaison de litteraux et d'operateurs donne des termes. Les relations entre les termes sont exprimees a l'aide d'equations. Les paragraphes qui suivent traitent des litteraux, des operateurs et des termes; le S D.6.1.4 traite des equations. D.6.1.3.1 Litteraux Les litteraux sont des valeurs enumerees d'une sorte. Une definition de type partiel ne doit pas necessairement comporter de litteraux: tous les elements de la sorte peuvent | tre definis au moyen d'operateurs. Les litteraux peuvent | tre consideres comme des operateurs depourvus d'arguments. Une relation entre les litteraux peut | tre exprimee dans des equations. Dans la syntaxe concrete, les litteraux sont introduits apres le mot-cle LITERALS. Exemples: a) La definition de la sorte booleenne contient deux litteraux, a savoir True (vrai) et False (faux). Ainsi, la definition du type booleen se presente comme suit: NEWTYPE Boolean LITERALS True, False . | | ENDNEWTYPE Boolean; b) la sorte naturelle peut | tre definie a l'aide d'un litteral, le zero. Les autres valeurs peuvent | tre generees au moyen de ce litteral et d'operateurs; c) les valeurs de la sorte couleur _primaire peu- vent | tre definies de la m | me maniere que les litteraux booleens; NEWTYPE Primary _colour LITERALS Red, Green, Blue . | | ENDNEWTYPE Primary _colour; d) au S D.6.1.3.2, le troisieme exemple c) presente une definition de type partielle sans litteraux. D.6.1.3.2 Operateurs Un operateur est une fonction mathematique qui met en concor- dance une ou plusieurs valeurs (eventuellement de sortes differentes) avec une valeur resultante. Les operateurs sont intro- duits apres le mot-cle OPERATORS, la ou les sortes de leur ou leurs arguments et la sorte de resultat sont egalement indiquees (on parle de signature des operateurs). Exemples: a) dans le type booleen, un operateur appele <> peut | tre defini; il aura un argument de sorte booleen et egalement un resultat de sorte booleen. Dans la definition du type booleen, il se presente comme suit: NEWTYPE Boolean LITERALS True, False OPERATORS <>: Boolean->Boolean; . | | ENDNEWTYPE Boolean; b) l'operateur susmentionnne necessaire pour con- struire tous les nombres naturels est Next. Cet operateur prend un argument de sorte naturelle et donne une valeur naturelle (la valeur superieure suivante) en tant que resultat; c) il est possible de definir pour des couleurs un nouveau type qui n'a pas de litteraux mais utilise des litteraux de la sorte couleur primaire et certains operateurs: NEWTYPE Color OPERATORS Take: Primary _colour->Colour; Mix: Primary _colour, Colour->Colour; . | | ENDNEWTYPE Colour; Il s'agissait de prendre une couleur primaire et de la considerer comme une couleur puis de commencer a melanger plusieurs couleurs primaires afin d'obtenir d'autres couleurs. D.6.1.3.3 Termes A l'aide de litteraux et d'operateurs, il est possible de con- struire comme suit l'ensemble des termes: 1) Rassembler tous les litteraux dans un ensemble de la sorte dans laquelle ils sont definis - chaque litteral est un terme. 2) Un nouvel ensemble de termes est cree pour chaque operateur lorsque l'operateur est applique a toutes les com- binaisons possibles de termes de la sorte correcte crees precedemment: a) pour la sorte <>, l'ensemble de litteraux est { rue (vrai), False (faux } Le resultat de cette etape est { ot (True), Not (False } parce que nous avons seulement l'operateur Not (non); b) pour la sorte <>, le resultat de cette etape est { ext(0 } c) pour la sorte <> l'ensemble de litteraux est vide mais le resultat de cette etape est { ake(Red), Take(green), Take(Blue } 3) Les termes des ensembles crees au cours de l'etape precedente sont tous la sorte du resultat de l'operateur applique; par exemple, tous les resultats de l'operateur Not sont de la sorte booleenne. Alors, on reunit tous les ensembles de la m | me sorte, aussi bien des ensemble initiaux que les ensembles nouvellement crees: a) pour la sorte booleenne, on obtient l'ensemble { rue, False, Not(True), Not(False } b) pour les nombres naturels cette etape donne l'ensemble { , Next(0 } 4) Les deux dernieres etapes sont repetees a maintes reprises, et definissent en general un ensemble infini de termes: a) l'ensemble de termes booleens generes par les litteraux True et False et l'operateur Not est { rue, False, Not(True), Not(False), Not(Not(True)), Not(Not(False)), Not(Not(Not(True))), . | | } b) l'ensemble des termes naturels generes par le litteral 0 et l'operateur Next est { , Next(0), Next(Next(0)), Next(Next(Next(0))), . | | } c) l'ensemble des termes de couleur generes par les litteraux Red, Green et Blue de la sorte Primary _colour et les operateurs Take et Mix est { ake(Red), Take(Green), Take(Blue), Mix(Red, Take(Red)), Mix(Red, Take(Green)), Mix(Red, Take(Blue)), Mix(Green, Take(Red)), Mix(Green, Take(Green)), Mix(Green, Take(Blue)), Mix(Blue, Take(Red)), Mix(Blue, Take(Green)), Mix(Blue, Take(Blue)), . | | } D.6.1.4 Equations et axiomes D'une maniere generale, le nombre de termes generes au paragraphe precedent est superieur au nombre de valeurs de la sorte. A titre d'exemple, il existe deux valeurs booleennes mais l'ensemble de termes booleens a un nombre infini d'elements. Il existe cependant une possibilite d'etablir des regles specifiant quels sont les termes consideres comme designant la m | me valeur. Ces regles sont appelees equations et font l'objet du paragraphe suivant. Deux types particuliers d'equations, les axiomes et les equations conditionnelles, font l'objet des S D.6.1.4.2 et D.6.1.4.3. Les equations, les axiomes et les equations conditionnelles sont donnes, dans la syntaxe concrete apres le mot-cle AXIOMS. Ce mot-cle a ete conserve pour des raisons d'ordre historique. D.6.1.4.1 Equations Une equation indique quels sont les termes consideres comme designant la m | me valeur. Une equation relie deux termes separes par le symbole d'equivalence ==. Par exemple <> indique que les termes Not(True) et False sont equivalents; chaque fois que l'on trouve Not(True), on peut le remplacer par False sans changement de sens et vice versa. Dans certaines equations, l'ensemble de termes est divise en sous-ensembles discontinus de termes qui designent la m | me valeur. Ces sous-ensembles sont appeles classes d'equivalence. Dans le langage courant, les classes d'equivalence sont identifiees aux valeurs. Exemples: a) L'ensemble de termes de la sorte booleenne est divise en deux classes d'equivalence de termes par les deux axiomes suivants: Not(True) == False; Not(False) == True; Les classes d'equivalence qui en resultent sont: { rue, Not(False), Not(Not(True)), Not(Not(Not(False))), Not(Not(Not(Not(True)))), Not(Not(Not(Not(Not(False))))), . | | } et { alse, Not(True), Not(Not(False)), Not(Not(Not(True))), Not(Not(Not(Not(False)))), Not(Not(Not(Not(Not(True))))) } . | | Ces deux classes d'equivalence sont identifiees aux valeurs True (Vrai) et False (Faux); b) Dans le cas de couleurs, on peut desirer specifier que le melange d'une couleur primaire avec une couleur qui contient cette couleur primaire ne fait pas de difference. De plus, l'ordre dans lequel les primaires sont melanges est sans importance. Cela peut | tre enonce dans les equations suivantes: Mix(Red, Take(Red)) == Take(Red); Mix(Red, Mix(Red, Take(Green))) == Mix(Red, Take(Green)); Mix(Red, Mix(Red, Take(Blue))) == Mix(Red Take(Blue)); Mix(Red, Mix(Green, Take(Red))) == Mix(Green, Take(Red)); Mix(Red, Mix(Blue, Take(Red))) == Mix(Blue, Take(Red)); etc. Cela demande beaucoup de travail car des equations simi- laires apparaissent pour toutes les permutations de Red, Green et Blue. C'est pourquoi le LDS comporte la construction FOR-ALL qui introduit les noms de valeur representant une classe d'equivalence arbitraire (ou la valeur associee a cette classe d'equivalence). Cela peut | tre tres utile dans la situation ci-dessus; toutes les equations susmentionnees et celles qui sont indiquees par etc. peu- vent | tre decrites en quelques lignes sous la forme suivante: FOR ALL p1, p2 IN Primary _colour /*1*/ Mix(p1, Take(p1)) == Take(p1); /*2*/ Mix(p1, Mix(p1, Take(p2))) == Mix(p1, Take(p2)); /*3*/ Mix(p1, Mix(p2, Take(p1))) == Mix(p2, Take(p1)); /*4*/ Mix(p1, Take(p2)) == Mix(p2, Take(p1)); /*4*/ FOR ALL c IN Colour /*5*/ ( Mix(p1, Mix(p2, c)) == Mix(p2, Mix(p1, c)); /*6*/ ( Mix(p1, Mix(p2, c)) == Mix(Mix(p1, Take(p2)) c)) /*4*/ ) Dans les equations ci-dessus, il y a chevauchement mais cela ne pose pas de problemes pour autant que les equations ne se contredisent pas mutuellement. Les equations susmentionnees creent 7 classes d'equivalence dans l'ensemble de termes de la sorte Colour, de sorte qu'avec ces equations, il y a sept valeurs de couleurs. Les termes suivants sont dans les classes d'equivalence differentes: Take(Red), Take(Green), Take(Blue), Take(Red, Take(Green)), Mix(Green, Take(Blue)), Mix(Blue, Take(Red)), Mix(Blue, Mix(Green, Take(Red))). Tous les autres termes de la sorte Colour sont equivalents a l'un des termes ci-dessus. Dans les exemples d'equations comportant la construction FOR-ALL, appelees equations explicitement quantifiees, l'information que p1 et p2 sont des identificateurs de valeur de sorte Primary _colour est redondante; l'argument de l'operateur Take et le premier argument de l'operateur Mix ne peuvent | tre de la sorte Primary _colour. En general, les equations explicitement quantifiees deviennent plus lisibles mais il est possible d'omettre la quantification si la sorte des identificateurs de valeur peut | tre deduite du contexte. Dans ce cas, on dit que l'equation est implicitement quantifiee. Exemple: Les equations 4 et 5 ci-dessus sont les m | mes que: Mix(p1, Take(p2)) , c)) == Mix(p2, Take(p1)); Mix(p1, Mix(p2, c)) == Mix(p2, Mix(p1, c)); D.6.1.4.2 Axiomes Les axiomes sont simplement des especes particulieres d'equation, introduites parce que dans des situations pratiques, de nombreuses equations se rapportent a des booleens. Dans ce cas, les equations tendent a prendre la forme . | | == True (vrai), c'est-a-dire qu'elles indiquent qu'un terme donne est equivalent a True. Exemple: Admettons qu'un operateur soit defini pour une couleur type: Contains: Colour, Primary _colour-> Boolean; ce qui doit donner la reponse True (vrai) si la couleur primaire est contenue dans la couleur et False (faux) dans le cas contraire. Voici un exemple des equations dont il s'agit: FOR ALL p IN Primary _colour ( Contains(Take(p), p) == True; FOR ALL c IN Colour ( Contains(Mix(p,c), p) == True) ) La partie <<== True>> de ces equations peut | tre omise et les resultats sont appeles axiomes. Des axiomes peuvent se reconna | tre a l'absence du symbole d'equivalence ==; ils designent des termes qui sont equivalents a la valeur True (vrai) de la sorte booleenne. La construction de la seconde equation peut para | tre quelque peu forcee. Une meilleure maniere d'ecrire ces equations est indiquee apres l'introduction de certaines constructions utiles. D.6.1.4.3 Equations conditionnelles Les equations conditionnelles constituent un moyen d'ecrire des equations qui ne sont valables que dans certaines conditions. Ces conditions sont designees par la m | me syntaxe que les equa- tions non conditionnelles et sont separees par un symbole ==> de l'equation qui est valable si la condition est remplie. Exemple: L'exemple type d'une equation conditionnelle est la definition de la division en type reel ou: FOR ALL x, z IN Real ( z/= 0 == True ==> (x/z) * z == x) indique que, si la condition <> est valable, la division par z suivie de la multiplication par z donne la valeur originale. Cette equation conditionnelle n'indique rien quant a ce qui devrait arriver si une valeur de la sorte Real etait divisee par 0. Si l'on veut specifier ce qui se passe en cas de division par zero, il faudrait creer une equation conditionnelle de la forme suivante: FOR ALL x, z IN Real ( z = 0 == True ==> (x/z) * z == . | | ). En pareil cas, cependant, il est recommande de placer un <> du c | te droit, pour faciliter la lecture. Dans le cas ci-dessus l'equation deviendrait: FOR ALL x, z IN Real ( (x/z) * z == IF z/=0 ( (x/z) * z == THEN x ( (x/z) * z == ELSE . | | ( (x/z) * z == FI ) D.6.1.5 Informations complementaires concernant les equa- tions et les axiomes Les deux sections qui suivent traitent de certaines difficultes que l'on peut rencontrer lorsque des operateurs donnent des resultats appartenant a une sorte deja definie. Le S D.6.1.5.3 explique la notion d'erreur en tant que terme d'une equation. D.6.1.5.1 Coherence de la hierarchie En un point quelconque d'une specification en LDS, il existe une seule et unique definition de type de donnees. Cette definition de type de donnees contient les sortes, operateurs et equations predefinis et l'ensemble des sortes, operateurs et equations definis par l'utilisateur dans les definitions de type partielles visibles en ce point. (C'est la raison pour laquelle un texte NEWTYPE . | | ENDNEWTYPE est appele definition de type partielle .) Il en resulte certaines consequences pour les definitions de type aux niveaux inferieurs. Cette influence sur le type pourrait | tre peu souhaitable. A titre d'exemple, on pourrait specifier de facon erronee que deux termes sont equivalents, les rendant ainsi equivalents alors qu'ils ne sont pas dans une portee englobante. Il n'est pas admis de donner des equations telles que: a) les valeurs d'une sorte qui sont differentes dans une portee a un niveau superieur soient rendues equivalentes; b) de nouvelles valeurs soient ajoutees a une sorte definie dans une portee de niveau superieur. Cela signifie par exemple que, dans un bloc au niveau du systeme, des definitions de type partielles specifiees par l'utilisateur contenant un operateur ayant un resultat predefini doivent rapporter tous les termes produits par cet operateur a des valeurs de cette sorte de resultat. Exemples: a) Si, pour une raison quelconque, on donne l'axiome: FOR ALL n, m IN Integer ( (Fact(n) = Fact(m)) => (n = m)) afin de specifier que si les resultats de l'operateur Fact sont les m | mes, les arguments sont alors les m | mes. (A noter que => est l'implication booleenne; cela a peu de relation avec le signe d'equation conditionnellle ==>). Ainsi, par accident, les valeurs sont unifiees. Des equations des exemples precedents on peut deduire que Fact(0) = Fact(1) et cette derniere equation indique que 0 et 1 sont des notations differentes de la m | me valeur. Sur la base de cette derniere equation, on peut prouver que les nombres d'elements de la sorte Integer sont reduits a un. Avec l'aide d'une equation conditionnelle, on peut indi- quer que, pourvu que n et m ne soient pas egaux a 0, le m | me resultat de l'operateur Fact sur n et m implique n = m. En Led: FOR ALL n, m IN Integer ( n/=0, m/=0 ==> (Fact(n) = Fact(m)) => (n = m)) A noter que cette derniere equation n'ajoute rien a la semantique des nombres entiers; c'est un theoreme qui peut | tre deduit des autres equations. Par ailleurs, l'adjonction d'une equa- tion prouvable ne presente pas d'inconvenient. b) Admettons que l'on decouvre la necessite d'un operateur pour les factorielles lors de la specification d'un type donne. Dans la definition de type partielle de ce type, l'operateur Fact est introduit: Fact: Integer -> Integer; et les equations suivantes sont donnees pour definir cet operateur: Fact(0) == 1; FOR ALL n IN Integer ( n > 0 ==> Fact(n) == n * Fact(n-1)) Ces equations ne definissent pas Fact(-1) et ainsi, c'est un terme de la sorte Integer qui n'a pas de relation avec d'autres termes de cette sorte. En consequence, Fact(-1) est une nouvelle valeur de la sorte entier (et il en va de m | me pour Fact(-2), Fact(-3), etc). Cela n'est pas admis. L'exemple b) du S D.6.1.5.3 donne une definition correcte de fact. D.6.1.5.2 Egalite et inegalite Dans chaque type, les operateurs d'egalite et d'inegalite sont implicites. Ainsi, si une definition de type partielle introduit une sorte S, il y a alors des definitions implicites d'operateur: "=": S, S -> Boolean; "/=": S, S -> Boolean; (Remarque - Les guillemets specifient que = et/= sont utilises comme operateurs infixes.) L'operateur d'egalite presente les proprietes previsibles: a = a, a = b => b = a, a = b AND b = c => a = c, a = b => a == b, a = b => op(a) = op(b) for all operators op. Ces proprietes ne sont pas ecrites en syntaxe LDS et ne doivent pas | tre enoncees dans des axiomes ou des equations car elles sont implicites. La valeur booleenne obtenue lorsque cet operateur est applique est True (vrai) si les termes de la partie gauche et de la partie droite sont de m | me classe d'equivalence; sinon la valeur obtenue est False (faux). S'il n'est pas explicitement specifie, que la valeur est True (vrai) ou False (faux), la specification est incomplete. Pour l'operateur d'inegalite, c'est par une equation en LDS que l'on peut le mieux expliquer la semantique: FOR ALL a, b IN S ( a/= b == Not(a = b)) Il n'y a pas de difference entre l'egalite et l'equivalence. Deux termes qui sont equivalents designent la m | me valeur et l'operateur d'egalite entre eux donne le resultat True (vrai). D.6.1.5.3 Erreur On a juge necessaire, pour les exemples qui precedent, de specifier que l'application de l'operateur a certaines valeurs est consideree comme une erreur. Le LDS a un moyen de le specifier for- mellement: l'element ERROR. L'erreur devrait servir a exprimer: <>. Dans la syntaxe concrete, cela est indique par le terme Error!, qui ne peut | tre utilise comme argument d'un operateur. Lorsque Error resulte de l'application d'un operateur et que cette application est un argument d'un autre operateur, l'application d'operateur exterieur porte egalement Error dans son resultat (propagation-d'erreurs). Dans un terme conditionnel, la partie THEN ou la partie ELSE est evaluee, de sorte que l'une d'elle peut | tre une erreur sans que celle-ci soit evaluee (etant donnee que l'autre partie de l'alternative est evaluee). Exemples: a) Dans l'exemple de division de valeurs de sorte Real, les poids peuvent | tre remplaces comme suit: FOR ALL x, z IN Real ( (x/z) * z == IF z/=0 ( (x/z) * z == THEN x ( (x/z) * z == ELSE Error! ( (x/z) * z == FI ) Pour plus de clarte, on pourrait ajouter: FOR ALL x IN Real ( x/0 == Error!) b) Dans l'exemple comportant l'operateur Fact, on pourrait specifier que l'application de cet operateur sur des entiers negatifs est consideree comme une erreur (Error). Cela per- met d'eviter que Fact(-1), Fact(-2), . | | ne deviennent de nouvelles valeurs de la sorte Integer (entier). Il conviendrait de definir l'operateur Fact comme suit: n < 0 ==> Fact(n) == Error!; Fact(0) == 1; n > 0 ==> Fact(n) == Fact(n-1) * n; Ces trois lignes sont beaucoup plus claires que l'equation du style programmation indiquee ci-apres. En general, le terme con- ditionnel devrait | tre utilise s'il y a deux cas complementaires; l'embo | tage de termes conditionnels rend l'equation illisible, comme on peut le voir ci-dessous: Fact(n) == IF n > 0 Fact(n) == THEN Fact(n-1) * n Fact(n) == ELSE IF n = 0 Fact(n) == ELSE THEN 1 Fact(n) == ELSE ELSE Error! Fact(n) == ELSE FI Fact(n) == FI D.6.2 Generateurs et heritage Le present paragraphe traite de deux constructions qui peuvent | tre utilisees pour specifier des types ayant des parties communes. Le generateur specifie non un type mais un schema, qui devient un type lorsque les sortes, operateurs, litteraux et con- stantes formels sont remplaces par des termes reels. L'heritage offre la possibilite de creer un nouveau type en partant d'un type deja existant. Les noms de litteraux et d'operateurs peuvent | tre renommes et il est possible de specifier des litteraux, des operateurs et des equations supplementaires. D.6.2.1 Generateurs Une definition de generateur definit un schema parametre par des noms formels de sortes, de litteraux, de constantes et d'operateurs. Les generateurs sont destines a des types qui representent des <>, tels que des ensem- bles d'elements, des cha | nes d'elements, des fichiers d'enregistrement, des tables de consultation, des tableaux. On peut l'expliquer a l'aide d'un exemple pour lequel des variations peuvent | tre envisagees. Admettons qu'il soit necessaire qu'un type ressemble a la notion mathematique d'un ensemble d'entiers. La partie suivante du texte fait partie de la definition de type de cet ensemble d'entiers. Figure D.6.2.1 (comme tableau) [T37.100], p. 10 Toutes les equations ont une quantification implicite. La premiere equation indique que la suppression d'un element de l'ensemble vide donne l'ensemble vide pour resultat. La seconde equation indique que la suppression apres insertion du m | me element donne pour resultat l'ensemble tel qu'il etait avant l'insertion (a condition que l'ensemble ne contienne pas l'element); sinon l'ordre d'insertion et de suppression peut | tre interchangeable. La troisieme equation indique que l'element vide ne contient pas d'elements. La quatrieme equation indique qu'un element se trouve dans un ensemble s'il est le dernier element ajoute ou s'il se trouvait dans l'ensemble avant l'adjonction du dernier element. La derniere equation indique que l'ordre d'addition des elements ne fait aucune difference. Dans l'exemple de la figure D-6.2.1 Int _set (ensemble _d'entiers) n'est qu'un exemple d'un ensemble et si l'on a egale- ment besoin d'un PId _set, d'un Subscriber _set (ensemble _d'abonnes) et d'un Exchange _name _set (ensemble _de _noms _de _central) dans la specification, personne ne sera surpris qu'il contienne tous les operateurs Add (ajouter), Delete (supprimer) et Is _in (est _dans) et un litteral pour l'ensemble vide. Les equa- tions donnees pour ces operateurs facilitent la generalisation a d'autres ensembles. Tel est le cas ou la notion de generateur se revele utile; le texte commun peut | tre donne une fois et | tre utilise plusieurs fois. La figure D-6.2.2 presente le generateur. (A noter que les noms de sortes formels sont introduits par le mot cle TYPE, cela uniquement pour des raisons d'ordre historique.) Au lieu d'utiliser Integer (entier), on utilise le type formel Item et, pour pouvoir donner differents noms a l'ensemble entier vide et aux ensembles vides dans d'autres types, on fait egalement de ce litteral un parametre formel. Figure D.6.2.2 (comme tableau) [T38.100], p. 11 Avec ce generateur, le type Int _set peut | tre construit comme suit: NEWTYPE Int _set Set (Integer, empty _int _set) ENDNEWTYPE Int _set; Si l'on compare les figures D-6.2.1 et D-6.2.2, on constate que: a) GENERATOR et ENDGENERATOR sont remplaces par NEWTYPE et ENDNEWTYPE respectivement; b) les parametres formels de generateur (le texte entre parentheses apres le nom de generateur) sont supprimes; c) Set, Item et empty _set sont remplaces dans tout le generateur par Int _set, Integer et empty _int _set, respective- ment. Ainsi, il n'y a en fait aucune difference entre cet Int _set et celui de la figure D-6.2.1, mais . | | - si l'on a besoin d'un ensemble de valeurs Pid, on peut creer le type a l'aide de: NEWTYPE PId-set Set(PId, empty _pid _set) ENDNEWTYPE PId _set; - si l'on a besoin d'un ensemble d'abonnes, dans lequel les abonnes sont representes par un type introduisant la sorte Subscr, l'ensemble d'abonnes peut | tre cree a l'aide de: NEWTYPE Subscr _set Set(Subscr, empty _subscr _set) ENDNEWTYPE Subscr _set; Cela permet d'economiser du papier, de plus, le travail est facilite parce qu'il suffit de penser une fois aux ensembles et que ce travail peut | tre delegue a des specialistes qualifies sur les types de donnees abstraites. Exemple: Cet exemple montre un generateur utilisant une sorte, un operateur, un litteral et une constante formels. Il decrit une rangee d'elements ayant une longueur maximale max _length. La sorte comprend un litteral designant la rangee vide et les operateurs pour insertion et suppression d'elements dans une rangee ou de celle-ci, l'encha | nement de rangees, le choix d'une sous-rangee et la determination de la longueur d'une rangee. Ce dernier operateur est rendu formel ce qui permet de la nommer a nouveau. GENERATOR Row (TYPE Item, OPERATOR Length, LITERAL Empty, CONSTANT max _length) LITERALS Empty OPERATORS Length: Row -> Integer; Insert: Row, Item, Integer -> Row; Delete: Row, Integer, Integer -> Row; "//": Row, Row -> Row; Select: Row, Integer, Integer -> Row /* and other operators relevant for rows of items */ AXIOMS /* The equations for the operators above, among * / * which the following two (or equivalents) */ Length(r) = max _length ==> Insert(r, itm, int) == Error!; Length(r1) + Length(r2) > max _length ==> r1//r2 == Error! ENDGENERATOR Row; A noter que l'operateur formel Length (longueur) et le litteral Empty (vide) sont donnes une fois de plus dans le corps du generateur parce qu'ils sont renommes lors de leur instantiation. Dans le cas de l'operateur, les arguments et la sorte de resultat ne sont donnes que dans le corps. Le generateur Row (rangee) peut servir a faire des lignes, des pages et des livres, comme suit: NEWTYPE Line Row(Character, Width, Empty _line, 80) ENDNEWTYPE Line; NEWTYPE Page Row(Line, Length, Empty _page, 66) ENDNEWTYPE Page; NEWTYPE Book Row(Page, Nr _of _pages, Empty _book, 10000) ENDNEWTYPE Book; D.6.2.2 Heritage L'heritage constitue un moyen d'etablir toutes les valeurs de la sorte dite parente, certains ou tous les operateurs du type parent et toutes les equations du type parent. Pour les litteraux et les operateurs, il existe une possibilite de les nommer a nouveau. En general, c'est une methode satisfaisante parce que, dans ce cas, le lecteur peut deduire du contexte qu'il s'agit d'un autre type, m | me si les litteraux sont les m | mes. Si un operateur n'est pas herite, on lui attribue systematiquement un autre nom inaccessible a l'utilisateur. Le fait que les operateurs sont encore presents signifie que toutes les equations du type parent sont encore presentes (avec des operateurs portant un autre nom). Cela garantit que les valeurs parentes sont heritees. Avec la possibilite d'emp | cher l'utilisation d'un operateur (lorsqu'il n'est pas herite), on assure la possibilite d'ajouter de nouveaux operateurs. Apres le mot cle ADDING, on peut donner des litteraux, des operateurs et des equations comme dans un type ordi- naire. Toutefois, il faut faire attention aux nouveaux litteraux et aux confusions possibles entre operateurs herites et ajoutes. Lorsque les litteraux sont ajoutes, le resultat des operateurs herites, appliques a des nouveaux litteraux, doit | tre defini (par des equations). Lorsque des operateurs sont ajoutes, il ne faut pas oublier les operateurs nommes a nouveau de maniere invisi- ble et les equations associees. Les equations de definition des operateurs ajoutes devraient | tre compatibles avec les equations comportant des operateurs herites et non herites. Apres cette liste d'avertissements, prenons quelques exemples: a) Supposons que le newtype couleur est complet et disponible. Ce type est fonde sur le choix et le melange de fais- ceaux de lumiere de couleur primaire. Il faudrait de longues reflexions et un long texte et/ou copie pour definir quelque chose de semblable pour le choix et le melange de peinture. Une solution commode a ce probleme consiste a faire du newtype Colour (couleur) un generateur en effectuant uniquement deux remplacements: 1) la premiere ligne NEWTYPE Colour devient GENERATOR Colour (TYPE Primary _colour) 2) le mot-cle ENDNEWTYPE devient ENDGENERATOR. On peut maintenant nommer a nouveau le generateur lorsqu'il est instancie. Supposons que la sorte anterieure Primary _colour soit appelee Light _primary, et que la sorte Paint _pri- mary soit definie comme: NEWTYPE Paint _primary LITERALS Red, Yellow, Blue ENDNEWTYPE Paint _primary; Il est maintenant tres facile de definir deux types simi- laires, un pour la lumiere et un pour la peinture: NEWTYPE Light _colours Colour (Light _primary) ENDNEWTYPE; NEWTYPE Paint _colours Colour (Paint _primary) ENDNEWTYPE; Il n'y a pas de probleme jusqu'ici, mais comment peut-on voir la difference entre Take (Red) de Light _colour et celui de Paint _colour avec la m | me syntaxe? S'il est necessaire de distinguer entre ces deux termes, on peut avoir recours a l'heritage. Au lieu de Light _colours et Paint _colours, les types Light (lumiere) et Palette sont definis par heritage et le nom de l'operateur Take (prendre) est modifie: NEWTYPE Light INHERITS Light _colours OPERATORS (Beam=Take, Mix, Contains) ADDING LITERALS White AXIOMS White == Mix (Red, Mix (Yellow, Beam (Blue))) ENDNEWTYPE Light; Maintenant le newtype Light (lumiere) a les litteraux de Light _colours et le litteral White (blanc). Light _colours n'a pas de litteraux qui lui soient propres (car il utilise les litteraux de Light _primary), de sorte que White est le seul litteral de Light. Les operateurs et les equations de Light sont les m | mes que ceux de Light _colours, a l'exception du fait que le nom d'operateur Take est remplace par Beam (faisceau) et que l'equation pour White a ete ajoutee. L'axiome ajoute indique que ce litteral ajoute devient un element de l'ensemble de termes dans lequel les trois couleurs primaires sont melangees. Le newtype Palette a les litteraux de Paint _colours et l'operateur Take est remplace par Paint (peinture): NEWTYPE Palette INHERITS Paint _colours OPERATORS (Paint _Take, Mix, Contains) ENDNEWTYPE Palette; b) Admettons que l'on veuille etendre l'ensemble de types entiers (sorte Int _set), introduit dans la section precedente, par un operateur qui trouve le plus petit entier de l'ensemble. Tout d'abord, il faut se demander si cet operateur peut | tre introduit dans la definition de generateur pour le rendre disponible a tous les ensembles et autres choses. S'il est vrai que cela peut | tre fait, cela limiterait l'element a la definition de > et <. Cela ne convient pas a tous les elements (PId par exemple) et il peut | tre preferable de creer un newtype ayant la sorte New _int _set comportant un operateur Min. NEWTYPE New _int _set INHERITS Int _set OPERATORS ALL ADDING OPERATORS Min: New _int _set-> Integer AXIOMS Min(Empty _int _set) == Error!; Min(Add(Empty _int _set, x))==x; Min(Add(Add(nis,x),y))== IF y >); b) tous les enonces vrais peuvent | tre tires des equations. Ils sont soit indiques comme des axiomes, soit deduits par substitution de termes equivalents dans les equations; c) aucune incoherence doit | tre decelee, c'est-a-dire que l'on ne peut deduire des equations que Vrai = Faux. Une procedure permettant de trouver des equations peut | tre exprimee en LDS informel, comme indique dans la figure D-6.3.1. D.6.3.2 Application de fonctions aux constructeurs D'une maniere generale, l'ensemble d'operateurs possede un sous-ensemble d'operateurs appeles <> et <>. Les constructeurs peuvent servir a generer toutes les valeurs (classes d'equivalence) de la sorte. Dans cette approche, les litteraux sont consideres comme des operateurs sans argument. Exemples: a) le type booleen a ses litteraux pour construc- teurs; b) le type naturel a le litteral 0 et l'operateur Next comme constructeurs; un naturel quelconque peut | tre con- struit seulement avec 0 et Next; c) le generateur pour les ensembles a le litteral ensemble _vide et l'operateur _additif comme constructeurs; un ensemble quelconque ne peut | tre construit qu'en utilisant Empty _set (ensemble _vide) et Add (ajouter); d) le type entier peut | tre construit au moyen des litteraux 0 et 1, des operateurs + et moins unaires. Figura D-6.3.1, (N), p. 12 A noter qu'il y a parfois plusieurs choix possibles pour l'ensemble de constructeurs. Tout choix sera valable pour le reste de la presente section mais les petits ensembles sont generalement les meilleurs. Ensuite, les fonctions sont traitees une par une. Pour chaque argument d'une fonction, seuls sont enumeres tous les termes possi- bles composes de constructeurs. Pour eviter le probleme que posent les nombres infinis de termes, il faut appliquer la quantification. Exemples: a) Pour les nombres naturels, cette liste peut | tre reduite a: 0 Next (n) ou n est tout nombre naturel. b) Pour les ensembles, la liste eventuelle peut | tre: empty _set Add (s,i) ou s est tout ensemble et i tout element (item). Si, dans le terme de droite d'une equation ayant (s,i) du c | te gauche, il y a une difference entre s etant vide ou n'etant pas vide, on peut reecrire la liste comme suit: empty _set Add (empty _set,i) ou i est un element (item) quelconque, Add (Add (s,i),j) ou s est un ensemble quelconque et i, j, un element quelconque. Apres la creation de cette liste, on obtient les parties de gauche des equations en appliquant chaque fonction a une com- binaison d'arguments tires de la liste. Les identificateurs de valeurs de differents arguments recoivent des noms differents. La procedure indiquee ci-dessus pour les fonctions peut | tre appliquee aux constructeurs; dans ce cas, elle donne les relations entre des termes ou les constructeurs sont utilises dans differents ordres. Exemples: a) Pour l'operateur de multiplication de nombres naturels portant la signature <<*>>:Natural, Natural -> Natural Cette procedure donne la partie de gauche des equations (incompletes) suivantes. L'utilisateur devra ajouter la partie de droite. Next (n) 0*0 == . | | ; Next (n) 0*Next (n) == . | | ; Next (n)*0 == . | | ; Next (n)*Next (m) == . | | ; b) Pour les operateurs Is _in (est _dans) et Delete (supprimer, dans le generateur Set (voir le S D.6.2.1), cette approche est deja appliquee. c) Pour la sorte Colour, les constructeurs sont Take et Mix. Un operateur analogue a Contains dans le S D.6.1.4.2 doit | tre defini pour les arguments. Take(p) ou p est toute couleur primaire Mix(p,c) ou p est toute couleur primaire et c une couleur quelconque. Etant donne que l'on avait annonce au S D.6.1.4.2 que les equations completes seraient donnees pour cet operateur: Contains(Take(p),q) ==p=q; Contains(Mix(p,c),q) ==(p=q) OR Contains(c,q); Cette procedure de construction peut donner plus d'equations que cela n'est necessaire, mais elle est tres s | re. Dans l'exemple susmentionne de multiplication des nombres naturels, il est vraisemblable que la propriete de commutativite de la multipli- cation sera indiquee et qu'en consequence, seule la derniere (ou la seconde) equation des trois premieres sera necessaire. La procedure decrite dans cette section peut | tre appliquee en combinaison avec la procedure decrite dans la section precedente, ou elle est utile pour la t | che <>. D.6.3.3 Specification d'ensemble d'essai On peut aussi considerer les equations du point de vue de la mise en oeuvre. Si les operateurs sont mis en oeuvre sous la forme de fonctions dans un langage de programmation, les equations mon- trent comment ces fonctions doivent | tre testees. Il convient d'evaluer les expressions correspondant a la par- tie de gauche d'une equation, de faire de m | me pour la partie droite de cette equation et de voir si elles sont equivalentes. C'est la construction FOR ALL qui pourrait poser certains problemes. Ceux-ci peuvent souvent | tre resolus de maniere pragmatique: Au lieu de tif de test peut utiliser FOR ALL i IN Integer le dispositif de test peut utiliser FOR ALL i IN { (em10,-1,0,1,1 } et proceder ainsi dans la plupart des cas. Considerer des equations comme necessaires a la mise en oeuvre peut | tre utile pour ce qui est de la t | che <> dans la procedure du S D.6.3.1. D.6.4 Caracteristiques La presente section decrit certains dispositifs du LDS qui sont rarement necessaires dont on peut pratiquement se passer, mais qui rendent quelquefois la t | che plus facile. D.6.4.1 Operateurs caches Il arrive que l'ensemble des equations puisse | tre simplifie ou rendu plus lisible gr | ce a l'introduction d'un operateur supplementaire, mais cet operateur ne devrait pas | tre utilise dans les processus. Cela signifie que l'operateur est visible de l'interieur mais cache en dehors de la definition de type. On peut atteindre ce resultat en definissant un <>, c'est-a-dire un type que l'utilisateur ne doit pas employer. A partir de ce type cache, l'utilisateur peut heriter de tous les operateurs auxquels il peut avoir acces; c'est le type herite qui doit | tre utilise. On peut s'assurer qu'il est correctement employe en examinant toutes les declarations de vari- ables (aucune variable de sorte introduite par le type cache ne doit appara | tre). Ce qui caracterise les operateurs caches, c'est qu'ils peuvent | tre atteints par une restriction de leur visibilite aux seules equations. On peut le faire en placant un point d'exclamation apres l'operateur. Exemple: La maniere courante de faire un ensemble d'un element a partir du generateur Set est la suivante: Add(empty _set,x) et c'est ainsi que doit le faire chaque utilisateur. Dans les equa- tions, le specificateur peut utiliser un operateur special, par exemple: Mk _set!:Item->Set; defini par l'equation: Mk _set!(itm) == Add(empty _set,itm); qui peut | tre utilise dans des definitions de type partiel mais non dans le corps de processus en LDS. D.6.4.2 Relations d'ordre Lorsqu'il faut specifier une relation d'ordre sur les elements d'une sorte, cela signifie en general qu'il faut definir quatre operateurs (<,<=,>,>=) et les proprietes mathematiques ordinaires (transitivite, etc.). S'il y a de nombreux litteraux, il faut egalement donner de nombreuses equations. Par exemple, le type de donnees predefinies Character est defini de cette maniere. Le LDS comporte une caracteristique qui permet d'abreger ces definitions de type longues, peu lisibles et ennuyeuses: c'est l'abreviation ORDERING (relation d'ordre). ORDERING est donne dans la liste d'operateurs, de preference au debut ou a la fin de celle-ci. Cela permet d'introduire des operateurs de relation d'ordre et les equations normales. Lorsque ORDERING est specifie, il faut donner les litteraux, s'il en existe, dans l'ordre ascendant. Exemple: NEWTYPE Even _decimal _digit LITERALS 0,2,4,6,8 OPERATORS ORDERING ENDNEWTYPE Even _decimal _digit; Maintenant, l'ordre 0<2<4<6<8 est implicite. Au S D.6.2.2 (Heritage), on soulignait qu'il fallait s'assurer que les litteraux etaient ajoutes a une sorte heritee. Il convient d'en indiquer ici la raison. Admettons que l'on desire l'extension suivante de la sorte Even _decimal _digit: NEWTYPE Decimal _digit INHERITS Even _decimal _digit OPERATORS ALL ADDING LITERALS 1,3,5,7,9 AXIOMS 0<1; 1<2; 2<3; 3<4; 4<5; 5<6; 6<7; 7<8; 8<9 ENDNEWTYPE Decimal _digit; Les axiomes donnes ici ne peuvent | tre omis. Sans ces axiomes, il ne peut y avoir qu'un ordre dit partiel: 0<2<4<6<8 et 1<3<5<7<9. Avec les axiomes ci-dessus, on obtient un ordre complet: 0<1<2<3<4<5<6<7<8<9 mais avec l'axiome <<9<0>> au lieu de l'ensemble d'axiomes ci-dessus, l'ordre complet serrait le suivant: 1<3<5<7<9<0<2<4<6<8. D.6.4.3 Sortes avec champs Comme indique au S 5.4.1.10 de la Recommandation, on peut definir une sorte structuree sans constructions speciales, mais les sortes structurees sont a la fois courantes et utiles, ce qui jus- tifie certaines constructions supplementaires dans le langage. Une sorte structuree devrait | tre utilisee lorsqu'une valeur d'objet est formee par l'association de valeurs de plusieurs sortes. Chaque valeur de cette association est caracterisee par un nom, appele nom de champ. La sorte d'un champ est fixe. Exemples: NEWTYPE Subscriber STRUCT numbers Number _key; name Name _key; admin Administrative; ENDNEWTYPE Subscriber; NEWTYPE Name _key STRUCT name, street Charstring; number Integer; city Charstring; ENDNEWTYPE Name _Key; Avec une sorte structuree, certains operateurs sont definis implicitement: a) l'operateur constructeur, <<(.<>.)>> apres les valeurs de champ; b) les operateurs de selection de champ, les vari- ables de la sorte structuree suivies par un ! et le nom de champ, ou suivies par le nom de champ entre parentheses. Il ne faut pas confondre la variable suivie d'un ! avec l'operateur cache (S D.6.4.1). On trouvera un exemple dans la figure D-6.4.1. Figure D.6.4.1 (comme tableau) [T39.100], p. 13 D.6.4.4 Sortes indexees Une sorte indexee est une sorte pour laquelle le type a pour nom d'operateur Extract! (extraction). Dans les types de donnees predefinies, le generateur Array est un tel type. Array est l'un des exemples les plus courants de type indexe. Pour l'operateur cache Extract!, il existe une syntaxe concrete speciale qui doit | tre appliquee en dehors des definitions de type. On peut penser que le type Index dans le generateur predefini Array doit | tre un type <> comme Integer, Natural ou Character. Toutefois, il n'y a pas de raison pour qu'une structure comme Name _key ne puisse pas | tre utilisee comme Index. Exemple: NEWTYPE Subsc _data _base Array (Name _key, Subscriber) ENDNEWTYPE Subsc _data _base; Les sortes Name _key et Subscriber sont celles qui ont ete definies dans la section precedente. Supposons qu'il existe une procedure Bill comportant un parametre de sorte Subscriber et que cette procedure soit definie dans un processus qui comporte aussi une variable Sub _db de la sorte Subsc _data _base. Dans ce pro- cessus, l'appel suivant pourrait appara | tre. CALL Bill (Sub _db) (. `P.M.`, `Downingstreet`10. `Lon- dres`.))); D.6.4.5 Valeur par defaut de variables Comme indique dans la section concernant la declaration de variables (S D.3.10.1), il est possible d'affecter des valeurs a une variable immediatement apres la declaration. Cependant, cer- tains types ont une valeur qui sera (presque) toujours la valeur initiale d'une variable. Il existe une caracteristique qui permet d'eviter d'ecrire la valeur initiale pour chaque declaration: la clause DEFAULT. A titre d'exemple, on peut considerer l'ensemble. Il est tres probable que presque toutes les variables, de tout ensemble ima- ginaire, seront initialisees avec empty _set. La notation: DEFAULT empty _set apres la liste d'equations indique que chaque variable de chaque instantiation de ce generateur sera initialisee a la valeur empty _set de cette instantiation, sauf s'il y a une initialisation explicite (voir le S D.3.10.1.) S'il n'est par s | r que la valeur initiale de toutes les variables d'une sorte soit la m | me, il ne faut pas utiliser la clause DEFAULT, sinon il est difficile d'eviter des surprises. D.6.4.6 Operateurs actifs Les utilisateurs qui connaissent la Recommandation Z.104 de 1984 concernant le LDS pourraient se demander ce qui est arrive aux operateurs dits actifs. En fait, cette caracteristique a ete supprimee, pour les raisons suivantes: a) elle n'est pas necessaire car les operateurs courants et les procedures et/ou macros offrent la m | me capacite d'expression; b) elle compromet la lisibilite des equations; c) de nombreux utilisateurs ont eu des difficultes a l'utiliser correctement; d) elle ne s'integre pas au modele de type de donnees abstrait fonde sur les algebres initiales qui constituent le modele choisi comme base mathematique de cette partie du LDS. MONTAGE: S D.7 SUR LE RESTE DE CETTE PAGE