home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Standards 1993 July / Disc.iso / ccitt / 1988 / ascii / 10_2_04.txt < prev    next >
Encoding:
Text File  |  1991-12-22  |  79.4 KB  |  2,311 lines

  1.  
  2.  
  3.  
  4.        5i'
  5.  
  6.  
  7.        D.5.4          Directives applicables a la representation en  fonc-
  8.        tion des etats et aux elements graphiques
  9.  
  10.  
  11.             Le present paragraphe decrit la representation en fonction des
  12.        etats du LDS/GR et des elements graphiques utilises.
  13.  
  14.             Le S D.5.4.1 contient des observations d'ordre general sur  la
  15.        representation  en  fonction  des etats: caracteristiques, applica-
  16.        tions pertinentes et variantes.
  17.  
  18.             Le  S D.5.4.2  explique  la  description  d'etats   au   moyen
  19.        d'elements graphiques.
  20.  
  21.  
  22.        D.5.4.1          Observations d'ordre general sur la representation
  23.        en fonction des etats
  24.  
  25.  
  26.             Le LDS/GR offre trois versions  differentes  pour  decrire  un
  27.        diagramme de processus.
  28.  
  29.             La premiere est appelee version  du  LDS/GR  en  fonction  des
  30.        transitions, dans laquelle les transitions sont decrites exclusive-
  31.        ment par des symboles d'action explicites.
  32.  
  33.             La seconde est appelee version du  LDS/GR  orientee  vers  les
  34.        etats  ou  extension  graphique du LDS orientee vers les etats; les
  35.        etats d'un  processus  y  sont  decrits  a  l'aide  d'illustrations
  36.        d'etats  et  les  transitions ne sont donnees qu'implicitement, par
  37.        les differences entre les etats de depart et d'arrivee.
  38.  
  39.             La derniere est appelee version mixte; il  s'agit  d'une  com-
  40.        binaison des deux versions precedentes.
  41.  
  42.             On trouvera des exemples de ces trois versions dans l'annexe E
  43.        du present fascicule.
  44.  
  45.             La version orientee vers les transitions convient  lorsque  la
  46.        sequence  des actions presente plus d'importance que la description
  47.        detaillee des etats.
  48.  
  49.             La version orientee vers les etats decrit en detail les  etats
  50.        par  des enonces; elle convient donc au cas ou un etat de processus
  51.        presente  plus  d'importance  que  la  sequence   des   actions   a
  52.        l'interieur de chaque transition, alors que l'explication graphique
  53.        intuitive est souhaitable et qu'il est interessant de conna  |  tre
  54.        les ressources ainsi que leurs relations avec les etats.
  55.  
  56.             Les illustrations d'etat sont generalement exprimees  par  des
  57.        elements  graphiques indiquant les ressources pertinentes de l'etat
  58.        en cours du processus. Cette version convient  a  des  applications
  59.        dans  lesquelles  sont  definis des elements graphiques appropries;
  60.        l'utilisateur  peut  donc  employer   cette   representation   pour
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.        n'importe quelle application en definissant des elements graphiques
  71.        appropries selon les besoins.
  72.  
  73.             La version mixte convient lorsqu'il faut conna | tre a la fois
  74.        la  sequence  des  actions  interieures  a chaque transition et les
  75.        descriptions detaillees des etats.
  76.  
  77.  
  78.        D.5.4.2         Illustration d'etat et element graphique
  79.  
  80.  
  81.  
  82.        D.5.4.2.1   Element graphique et texte qualificatif
  83.  
  84.  
  85.             Si l'on a choisi l'option  illustration  d'etat,  celle-ci  se
  86.        compose  d'elements  graphiques  et  d'un texte qualificatif, comme
  87.        indique dans la figure D-5.4.1 a) a D-5.4.1 d).
  88.  
  89.             Cette  combinaison  rend  comprehensibles  les   illustrations
  90.        d'etat. A titre d'exemple, la figure D-5.4.1 a) donne la significa-
  91.        tion  d'un  recepteur  a  cadran   manipule   par   le   processus,
  92.        l'exemple b)  celle d'un emetteur de tonalite de numerotation emet-
  93.        tant un signal permanent vers l'environnement.
  94.  
  95.             A noter que les signaux de sortie (signaux non permanents)  et
  96.        les  ressources  pertinentes ne sont pas decrits dans les illustra-
  97.        tions d'etat; les signaux de sortie peuvent  | tre decrits dans  un
  98.        diagramme de transition.
  99.  
  100.             L'exemple c) montre un  temporisateur  dont  l'expiration  est
  101.        toujours  representee  par  une  entree. A noter que l'illustration
  102.        graphique recommandee pour  le  temporisateur  comporte  le  signal
  103.        d'entree pertinent t1.
  104.  
  105.             Le dernier exemple, d), signifie qu'un  enregistreur  de  mes-
  106.        sages vocaux est en cours de fonctionnement.
  107.  
  108.             L'identite  de  la  ressource  peut   |  tre  considerablement
  109.        abregee  et  devrait,  si  possible,  | tre placee a l'interieur de
  110.        l'illustration graphique appropriee. Ainsi, les elements graphiques
  111.        qui sont qualifies sont tout a fait evidents.
  112.  
  113.  
  114.        D.5.4.2.2  Illustrations d'etat completes
  115.  
  116.  
  117.             Chaque illustration d'etat doit comporter un nombre  suffisant
  118.        d'elements graphiques afin de montrer:
  119.  
  120.                a)         quelles ressources le processus met en oeuvre au
  121.        cours  de  l'etat  represente.  Exemples:  trajets  de commutation,
  122.        recepteurs de signalisation, emetteurs  de  signaux  permanents  et
  123.        modules de commutation;
  124.  
  125.                b)         s'il y a en ce moment un ou plusieurs temporisa-
  126.        teurs qui contr | lent le processus;
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.                c)         dans le cas ou le processus concerne le  traite-
  137.        ment des appels, si la taxation est ou non actuellement en cours et
  138.        quels abonnes sont taxes au cours de cette phase de l'appel;
  139.  
  140.                d)          quels objets  appartenant  effectivement  a  un
  141.        autre  processus  (environnement) sont consideres comme en relation
  142.        avec des ressources du processus pendant l'etat en cours;
  143.  
  144.                e)         les signaux permanents de sortie qui  sont  emis
  145.        dans cet etat;
  146.  
  147.                f )         la relation entre  les  signaux  et  ressources
  148.        existants  dans l'etat;
  149.  
  150.                g)         l'inventaire des ressources concernant l'etat en
  151.        cours du processus.
  152.  
  153.  
  154.                                                  Figura D-5.4.1, (N), p. 1
  155.  
  156.  
  157.  
  158.        D.5.4.2.3  Exemple
  159.  
  160.  
  161.             A  titre  d'exemple  d'application   des   principes   exposes
  162.        ci-dessus,  considerons  l'etat  de la figure D-5.4.2. On peut voir
  163.        que, dans cet etat:
  164.  
  165.                a)         les ressources affectees aux processus sont:  un
  166.        recepteur  de  chiffres  a  cadran,  un  emetteur  de  tonalites de
  167.        numerotation, un poste d'abonne appartenant  a  l'environnement  et
  168.        des trajets de communication reliant ces organes;
  169.  
  170.                b)         un temporisateur t0 surveille le processus;
  171.  
  172.                c)         aucune taxation n'est en cours;
  173.  
  174.                d)         l'abonne est  identifie  comme  l'abonne A  mais
  175.        aucune autre information de categorie n'est prise en consideration;
  176.  
  177.                e)         les signaux d'entree suivants sont  attendus:  A
  178.        _on  _hook (A raccroche), digit (chiffre) (chiffre numerote) et  t0
  179.        (le temporisateur de supervision t0 fonctionne);
  180.  
  181.                f )         le signal permanent de sortie DT  (tonalite  de
  182.        numerotation) a ete mis avant cet etat et pendant celui-ci.
  183.  
  184.  
  185.                                                  Figure D-5.4.2, (N), p. 2
  186.  
  187.  
  188.  
  189.        D.5.4.2.4  Verification de la  coherence  de  diagrammes  LDS  avec
  190.        elements graphiques
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202.             On constate que l'illustration d'etat  est  plus  compacte  et
  203.        que,   d'une   certaine   maniere,   elle  offre  au  lecteur  plus
  204.        d'informations; cependant,  l'identification  de  la  serie  exacte
  205.        d'operations  accomplies  au cours de la transition exige un examen
  206.        tres attentif des ressources.
  207.  
  208.             En outre, une simple observation de l'illustration  d'etat  ne
  209.        permet pas de determiner l'ordre des actions dans la transition.
  210.  
  211.             Les elements graphiques representes a l'exterieur du bloc sont
  212.        des elements qui ne sont pas directement commandes par le processus
  213.        donne: ceux qui sont representes a l'interieur du symbole <<limites
  214.        du bloc>> sont directement commandes par ce processus. Par exemple,
  215.        le processus d'appel partiellement specifie dans la  figure D-5.4.3
  216.        peut  allouer ou liberer l'emetteur de tonalite d'appel, l'emetteur
  217.        de sonnerie et les  trajets  de  conversation;  il  peut  egalement
  218.        declencher  ou  arr | ter le temporisateur T4, mais il ne peut com-
  219.        mander directement la condition du combine de l'abonne.
  220.  
  221.             En concevant la logique a partir d'une specification LDS  avec
  222.        elements  graphiques,  seuls  les elements graphiques representes a
  223.        l'interieur des limites du bloc ont une influence sur  les  actions
  224.        executees pendant les sequences de la transition. Les elements gra-
  225.        phiques complexes representes a l'interieur des limites de ce  bloc
  226.        sont normalement inlus dans une illustration d'etat:
  227.  
  228.                a)         soit parce qu'ils indiquent  les  ressources  et
  229.        l'etat  de l'environnement concernes par le signal d'entree du pro-
  230.        cessus pendant l'etat donne;
  231.  
  232.                b)          soit  pour   ameliorer   l'intelligibilite   du
  233.        diagramme.
  234.  
  235.  
  236.        D.5.4.2.5   Utilisation du symbole <<temporisateur>>
  237.  
  238.  
  239.             Que l'on emploie ou non des elements graphiques,  l'expiration
  240.        d'un  delai  de  temporisation  est  toujours  representee  par une
  241.        entree.
  242.  
  243.             La presence d'un symbole de temporisateur dans  une  illustra-
  244.        tion  d'etat  implique  qu'un  temporisateur fonctionne pendant cet
  245.        etat.
  246.  
  247.  
  248.                                                  Figure D-5.4.3, (N), p. 3
  249.  
  250.  
  251.             Conformement au principe general expose dans  les  Recommanda-
  252.        tions,  le  demarrage, l'arr | t, le redemarrage et l'expiration du
  253.        temporisateur sont representes a l'aide d'elements graphiques de la
  254.        maniere suivante:
  255.  
  256.                a)         pour montrer qu'une  temporisation  commence  au
  257.        cours d'une transition donnee, le symbole temporisateur doit appara
  258.        | tre sur l'illustration d'etat qui correspond a la  fin  de  cette
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.        transition et non sur celle qui correspond a son debut;
  269.  
  270.                b)          inversement, pour montrer qu'une  temporisation
  271.        s'arr | te au cours d'une transition, le symbole temporisateur doit
  272.        appara | tre sur l'illustration d'etat qui correspond au  debut  de
  273.        cette transition et non sur celle qui correspond a sa fin;
  274.  
  275.                c)         pour montrer qu'une temporisation  est  relancee
  276.        au  cours  d'une transition un symbole explicite de t | che doit  |
  277.        tre represente dans cette transition (on en voit deux exemples  sur
  278.        la figure D-5.4.4);
  279.  
  280.                d)         l'expiration du delai d'une temporisation donnee
  281.        est  representee  par  un  symbole  d'entree associe a un etat dont
  282.        l'illustration porte le symbole <<temporisateur>> correspondant. Il
  283.        peut naturellement arriver que plusieurs temporisateurs surveillent
  284.        a la fois le m | me processus (voir la figure D-5.4.5).
  285.  
  286.  
  287.                                                  Figure D-5.4.4, (N), p. 4
  288.  
  289.  
  290.  
  291.  
  292.                                                  Figure D-5.4.5, (N), p. 5
  293.  
  294.  
  295.  
  296.        D.5.5         Diagrammes auxiliaires
  297.  
  298.  
  299.             Pour faciliter la lecture et la comprehension de diagrammes de
  300.        processus de grande taille et/ou complexes, l'auteur peut y ajouter
  301.        des diagrammes auxiliaires informels. De tels  documents  ont  pour
  302.        but de donner une description synoptique ou simplifiee du comporte-
  303.        ment du processus (ou d'une partie de celui-ci). Les documents aux-
  304.        iliaires  ne  remplacent  pas les documents en LDS mais constituent
  305.        une introduction a ceux-ci.
  306.  
  307.             On trouvera dans la presente section des exemples de  certains
  308.        diagrammes   auxiliaires   couramment   utilises,   notamment   des
  309.        diagrammes synoptiques d'etat, des  matrices  etat/signal,  et  des
  310.        diagrammes  de  sequencement. (Le diagramme en arbre de bloc decrit
  311.        au S D.4.4 est egalement un diagramme auxiliaire.)
  312.  
  313.  
  314.        D.5.5.1         Diagramme synoptique d'etat
  315.  
  316.  
  317.             Son objectif est de donner une vue d'ensemble des  etats  d'un
  318.        processus,  et  d'indiquer quelles transitions sont possibles entre
  319.        eux. Etant donne qu'il  s'agit  de  donner  un  apercu,  l'on  peut
  320.        negliger les etats ou les transitions de peu d'importance.
  321.  
  322.             Les diagrammes se composent de  symboles  d'etat,  de  fleches
  323.        representant  des  transitions  et,  eventuellement, de symboles de
  324.        debut et d'arr | t.
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.             Le symbole d'etat doit indiquer le nom  de  l'etat  reference.
  335.        Plusieurs  noms  d'etat peuvent  | tre inscrits dans le symbole, et
  336.        il est possible d'employer un asterisque (*) pour designer tous les
  337.        etats.
  338.  
  339.             Chacune des fleches peut, de m | me que  chacune  des  sorties
  340.        possibles  pendant  la transition,  | tre associee au nom du signal
  341.        ou de l'ensemble de signaux qui declenchent la transition.
  342.  
  343.             On trouvera dans la figure D-5.5.1  un  exemple  de  diagramme
  344.        synoptique d'etat.
  345.  
  346.  
  347.                                                 Figure D-5.5.1, (MC), p. 6
  348.  
  349.  
  350.             Il est  possible  de  repartir  sur  plusieurs  diagrammes  le
  351.        diagramme  synoptique  d'etat d'un processus; chacun des diagrammes
  352.        obtenus porte alors sur un aspect  particulier,  comme  <<cas  nor-
  353.        mal>>, traitement en cas de defaillance, etc.
  354.  
  355.  
  356.                                                  Figure D-5.5.2, (N), p. 7
  357.  
  358.  
  359.  
  360.  
  361.        D.5.5.2         Matrice etat/signal
  362.  
  363.  
  364.             La   matrice   etat/signal    doit    servir    de    document
  365.        <<preliminaire>>  a  un  diagramme  de  processus  important.  Elle
  366.        indique les endroits ou existent des combinaisons entre un etat  et
  367.        un signal dans le diagramme.
  368.  
  369.             Le  diagramme  se  compose  d'une  matrice   bidimensionnelle;
  370.        celle-ci  presente sur un axe tous les etats d'un processus, et sur
  371.        l'autre tous les signaux d'entree valides  d'un  processus.  L'etat
  372.        suivant est donne pour chaque element de matrice, de m | me que les
  373.        sorties possibles au cours de la transition. Une reference peut   |
  374.        tre  indiquee  pour  permettre de trouver la combinaison donnee par
  375.        les indices, si elle existe.
  376.  
  377.             L'element correspondant a l'etat fictif  ou  <<START>>  et  au
  378.        signal  fictif  <<CREATE>>  sert  a indiquer l'etat initial du pro-
  379.        cessus.
  380.  
  381.  
  382.                                                 Figure D-5.5.3, (MC), p. 8
  383.  
  384.  
  385.             Il est possible de  fractionner  la  matrice  en  sous-parties
  386.        reparties   sur   plusieurs   pages.  Les  references  sont  celles
  387.        qu'emploie normalement l'usager dans la documentation.
  388.  
  389.             Les  signaux  et  les  etats  doivent   |  tre  de  preference
  390.        regroupes  de  facon  que  chaque partie de la matrice porte sur un
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.        aspect particulier du comportement du processus.
  401.  
  402.  
  403.        D.5.5.3         Diagramme de sequencement
  404.  
  405.  
  406.             Le diagramme de sequencement peut servir a  montrer  l'echange
  407.        des sequences de signaux autorisees entre un ou plusieurs processus
  408.        et leur environnement.
  409.  
  410.             Ce diagramme doit donner une vue d'ensemble  de  l'echange  de
  411.        signaux entre les parties du systeme. Ce diagramme peut representer
  412.        l'ensemble ou une partie de l'echange de signaux, en  fonction  des
  413.        aspects a mettre en evidence.
  414.  
  415.             Les colonnes du diagramme indiquent les entites en  communica-
  416.        tion (services, processus, blocs ou l'environnement).
  417.  
  418.             Leurs interactions sont illustrees par un ensemble  de  lignes
  419.        flechees,  dont chacune represente un signal ou un ensemble de sig-
  420.        naux.
  421.  
  422.  
  423.                                                  Figure D-5.5.4, (N), p. 9
  424.  
  425.  
  426.             On peut annoter chaque sequence afin de  faire  appara  |  tre
  427.        clairement  l'ensemble  d'informations  echangees. Chaque ligne est
  428.        accompagnee d'une annotation qui donne  les  renseignements  requis
  429.        (noms des signaux ou de procedures).
  430.  
  431.             On peut placer un symbole de decision dans les  colonnes  pour
  432.        indiquer  que  la  sequence  suivante  est  valide  si la condition
  433.        indiquee est vraie. Dans ce cas, le symbole de decision appara |  t
  434.        generalement  plusieurs  fois; il indique les differentes sequences
  435.        produites par chacune des valeurs de la condition.
  436.  
  437.             Ce diagramme peut representer  la  totalite  ou  seulement  un
  438.        sous-ensemble significatif des sequences de signaux echanges.
  439.  
  440.             La representation de  l'interaction  reciproque  des  services
  441.        resultant  de la subdivision d'un processus represente une applica-
  442.        tion utile de ce type de diagramme.
  443.  
  444.             Les diagrammes de sequencement ne comprennent generalement pas
  445.        toutes   les   sequences  possibles;  ils  constituent  souvent  un
  446.        prealable a la definition complete.
  447.  
  448.  
  449.        D.6         Definition des donnees en LDS
  450.  
  451.  
  452.  
  453.        D.6.1         Directives applicables aux donnees en LDS
  454.  
  455.  
  456.             On  trouvera  dans  la  presente  section  des  renseignements
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466.        complementaires  sur  les concepts definis au S 5 de la Recommanda-
  467.        tion concernant le LDS. La principale difference entre la  presente
  468.        section et l'ancienne Recommandation Z.104 est que cette derniere a
  469.        fait  l'objet  d'une  revision  a  des  fins  de  clarification  et
  470.        d'harmonisation avec l'ISO. Certains des mots cles ont ete modifies
  471.        et  des  adjonctions  ont  ete  faites  mais  la  coherence  de  la
  472.        semantique  a ete assuree avec le Livre rouge. L'emploi des donnees
  473.        decrites  aux  S 2,  3   et 4   de   la   nouvelle   Recommandation
  474.        (auparavant Z.101-Z.103) est reste tel quel.
  475.  
  476.  
  477.        D.6.1.1         Introduction generale
  478.  
  479.  
  480.             Les types de donnees du LDS  sont  fondes  sur  l'approche  de
  481.        <<types de donnees abstraits>>: on ne decrit pas la maniere dont un
  482.        type doit  | tre mis en oeuvre, mais on se borne a dire  quel  sera
  483.        le resultat des operateurs applique aux valeurs.
  484.  
  485.             Lorsque l'on definit des donnees abstraites, chaque segment de
  486.        la  definition, appelee <<definition de type partielle>> est intro-
  487.        duit par le mot-cle NEWTYPE. Chaque definition de type partielle  a
  488.        une  incidence  sur les autres, de sorte que toutes les definitions
  489.        de type partielles au niveau du systeme constituent une  definition
  490.        de  type  de  donnees unique. Si plusieurs definitions de type par-
  491.        tielles sont introduites a un niveau inferieur (niveau de bloc, par
  492.        exemple),  leur  ensemble constitue, avec les definitions de niveau
  493.        superieur, une definition de type de donnees. Cela  signifie  qu'en
  494.        un  point  quelconque de la specification, il n'existe qu'une seule
  495.        definition de type de donnees.
  496.  
  497.             En substance, la definition de type de donnees comprend  trois
  498.        parties:
  499.  
  500.                a)         definitions de sortes;
  501.  
  502.                b)         definitions d'operateurs;
  503.  
  504.                c)         equations.
  505.  
  506.             Chacune de ces parties fait l'objet  d'explications  dans  les
  507.        paragraphes  qui  suivent.  La  definition  de  type de donnees est
  508.        structuree en definitions de type de  donnees  partielles,  chacune
  509.        introduisant  une  sorte. Les definitions d'operateurs et les equa-
  510.        tions recouvrent les definitions de type de donnees partielles.
  511.  
  512.  
  513.        D.6.1.2         Sortes
  514.  
  515.  
  516.             Une sorte est un ensemble de valeurs qui peut avoir un  nombre
  517.        fini ou infini d'elements mais ne peut  | tre vide.
  518.  
  519.  
  520.                Exemples:
  521.  
  522.  
  523.  
  524.  
  525.  
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532.                a)         l'ensemble de valeurs de la sorte booleenne  est
  533.        { rue (vrai), False (faux }
  534.  
  535.                b)          l'ensemble  de  valeurs  de  la  sorte  Natural
  536.        (naturel) est l'ensemble infini des nombres naturesls { , 1, 2, . |
  537.         }
  538.  
  539.                c)         l'ensemble de valeurs de la sorte Couleur  _pri-
  540.        maire est { ert, Rouge, Ble }
  541.  
  542.             Tous les elements d'une sorte ne doivent pas  |  tre  directe-
  543.        ment fournis par l'utilisateur (cela exigerait un temps infini dans
  544.        le cas des nombres naturels), mais le nom de la sorte doit   |  tre
  545.        indique.  Dans la syntaxe concrete, le mot-cle NEWTYPE est directe-
  546.        ment suivi par le nom de la sorte  (certaines  autres  possibilites
  547.        seront  indiquees  plus  loin). Ce nom est surtout utilise dans les
  548.        definitions d'operateurs, comme explique au S D.6.1.3, et dans  les
  549.        declarations de variables.
  550.  
  551.  
  552.        D.6.1.3         Operateurs, litteraux et termes
  553.  
  554.  
  555.             Les valeurs d'une sorte  peuvent   |  tre  definies  de  trois
  556.        manieres:
  557.  
  558.                a)         par une enumeration: les valeurs  sont  definies
  559.        dans la section des litteraux;
  560.  
  561.                b)         par des operateurs:  les  valeurs  sont  donnees
  562.        comme les resultats d'<<applications>> d'operateurs;
  563.  
  564.                c)           par   une   combinaison   d'enumerations    et
  565.        d'operateurs.
  566.  
  567.             La combinaison de litteraux et d'operateurs donne des  termes.
  568.        Les relations entre les termes sont exprimees a l'aide d'equations.
  569.        Les paragraphes qui suivent traitent des litteraux, des  operateurs
  570.        et des termes; le S D.6.1.4 traite des equations.
  571.  
  572.  
  573.        D.6.1.3.1  Litteraux
  574.  
  575.  
  576.             Les litteraux sont des  valeurs  enumerees  d'une  sorte.  Une
  577.        definition  de type partiel ne doit pas necessairement comporter de
  578.        litteraux: tous les elements de la sorte peuvent  | tre definis  au
  579.        moyen  d'operateurs.  Les litteraux peuvent  | tre consideres comme
  580.        des  operateurs  depourvus  d'arguments.  Une  relation  entre  les
  581.        litteraux  peut  | tre exprimee dans des equations. Dans la syntaxe
  582.        concrete, les litteraux sont introduits apres le mot-cle LITERALS.
  583.  
  584.  
  585.                Exemples:
  586.  
  587.  
  588.                a)          La definition de la  sorte  booleenne  contient
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.        deux  litteraux,  a  savoir  True (vrai) et False (faux). Ainsi, la
  599.        definition du type booleen se presente comme suit:
  600.  
  601.                NEWTYPE Boolean
  602.  
  603.                  LITERALS True, False
  604.  
  605.                  . |  |
  606.  
  607.                ENDNEWTYPE Boolean;
  608.  
  609.                b)         la sorte naturelle peut  | tre definie a  l'aide
  610.        d'un  litteral, le zero. Les autres valeurs peuvent  | tre generees
  611.        au moyen de ce litteral et d'operateurs;
  612.  
  613.                c)         les valeurs de la sorte couleur  _primaire  peu-
  614.        vent
  615.         | tre definies de la m | me maniere que les litteraux booleens;
  616.  
  617.                NEWTYPE Primary _colour
  618.  
  619.                  LITERALS Red, Green, Blue
  620.  
  621.                  . |  |
  622.  
  623.                ENDNEWTYPE Primary _colour;
  624.  
  625.                d)         au S D.6.1.3.2, le troisieme exemple c) presente
  626.        une definition de type partielle sans litteraux.
  627.  
  628.  
  629.        D.6.1.3.2  Operateurs
  630.  
  631.  
  632.             Un operateur est une fonction mathematique qui met en  concor-
  633.        dance   une   ou   plusieurs   valeurs  (eventuellement  de  sortes
  634.        differentes) avec une valeur resultante. Les operateurs sont intro-
  635.        duits apres le mot-cle OPERATORS, la ou les sortes de leur ou leurs
  636.        arguments et la sorte de  resultat  sont  egalement  indiquees  (on
  637.        parle de signature des operateurs).
  638.  
  639.  
  640.                Exemples:
  641.  
  642.  
  643.                a)          dans  le  type  booleen,  un  operateur  appele
  644.        <<not>> peut  | tre defini; il aura un argument de sorte booleen et
  645.        egalement un resultat de sorte booleen. Dans la definition du  type
  646.        booleen, il se presente comme suit:
  647.  
  648.                NEWTYPE Boolean
  649.  
  650.                  LITERALS True, False
  651.  
  652.                  OPERATORS <<Not>>: Boolean->Boolean;
  653.  
  654.                  . |  |
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.                ENDNEWTYPE Boolean;
  665.  
  666.                b)         l'operateur susmentionnne necessaire  pour  con-
  667.        struire  tous les nombres naturels est Next. Cet operateur prend un
  668.        argument de sorte naturelle  et  donne  une  valeur  naturelle  (la
  669.        valeur superieure suivante) en tant que resultat;
  670.  
  671.                c)          il est possible de definir pour des couleurs un
  672.        nouveau type qui n'a pas de litteraux mais utilise des litteraux de
  673.        la sorte couleur primaire et certains operateurs:
  674.  
  675.                NEWTYPE Color
  676.  
  677.                  OPERATORS
  678.  
  679.                    Take: Primary _colour->Colour;
  680.  
  681.                    Mix: Primary _colour, Colour->Colour;
  682.  
  683.                   . |  |
  684.  
  685.                ENDNEWTYPE Colour;
  686.  
  687.             Il s'agissait  de  prendre  une  couleur  primaire  et  de  la
  688.        considerer comme une couleur puis de commencer a melanger plusieurs
  689.        couleurs primaires afin d'obtenir d'autres couleurs.
  690.  
  691.  
  692.        D.6.1.3.3   Termes
  693.  
  694.  
  695.             A l'aide de litteraux et d'operateurs, il est possible de con-
  696.        struire comme suit l'ensemble des termes:
  697.  
  698.                1)          Rassembler tous les litteraux dans un  ensemble
  699.        de la sorte dans laquelle ils sont definis - chaque litteral est un
  700.        terme.
  701.  
  702.                2)          Un nouvel ensemble  de  termes  est  cree  pour
  703.        chaque operateur lorsque l'operateur est applique a toutes les com-
  704.        binaisons  possibles  de  termes  de  la   sorte   correcte   crees
  705.        precedemment:
  706.  
  707.                a)            pour  la  sorte  <<Boolean>>,  l'ensemble  de
  708.        litteraux  est  {  rue  (vrai), False (faux }  Le resultat de cette
  709.        etape est { ot (True), Not (False } parce que nous avons  seulement
  710.        l'operateur Not (non);
  711.  
  712.                b)         pour la sorte <<Natural>>, le resultat de  cette
  713.        etape est { ext(0 }
  714.  
  715.                c)         pour la sorte <<Colour>> l'ensemble de litteraux
  716.        est   vide  mais  le  resultat  de  cette  etape  est  {  ake(Red),
  717.        Take(green), Take(Blue }
  718.  
  719.                3)         Les termes  des  ensembles  crees  au  cours  de
  720.        l'etape  precedente  sont  tous la sorte du resultat de l'operateur
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.        applique; par exemple, tous les resultats de l'operateur  Not  sont
  731.        de  la sorte booleenne. Alors, on reunit tous les ensembles de la m
  732.        | me sorte, aussi bien des  ensemble  initiaux  que  les  ensembles
  733.        nouvellement crees:
  734.  
  735.                a)          pour la sorte booleenne, on obtient  l'ensemble
  736.        { rue, False, Not(True), Not(False }
  737.  
  738.                b)         pour les  nombres  naturels  cette  etape  donne
  739.        l'ensemble { , Next(0 }
  740.  
  741.                4)          Les  deux  dernieres  etapes  sont  repetees  a
  742.        maintes  reprises,  et definissent en general un ensemble infini de
  743.        termes:
  744.  
  745.                a)         l'ensemble de termes booleens  generes  par  les
  746.        litteraux  True  et  False  et  l'operateur  Not  est { rue, False,
  747.        Not(True),     Not(False),     Not(Not(True)),     Not(Not(False)),
  748.        Not(Not(Not(True))), . |  | }
  749.  
  750.                b)         l'ensemble des termes naturels  generes  par  le
  751.        litteral 0  et  l'operateur  Next  est  { , Next(0), Next(Next(0)),
  752.        Next(Next(Next(0))), . |  | }
  753.  
  754.                c)         l'ensemble des termes de couleur generes par les
  755.        litteraux  Red,  Green  et  Blue de la sorte Primary _colour et les
  756.        operateurs Take et Mix est  {  ake(Red),  Take(Green),  Take(Blue),
  757.        Mix(Red,  Take(Red)),  Mix(Red, Take(Green)), Mix(Red, Take(Blue)),
  758.        Mix(Green,   Take(Red)),   Mix(Green,   Take(Green)),    Mix(Green,
  759.        Take(Blue)),    Mix(Blue,   Take(Red)),   Mix(Blue,   Take(Green)),
  760.        Mix(Blue, Take(Blue)), . |  | }
  761.  
  762.  
  763.        D.6.1.4         Equations et axiomes
  764.  
  765.  
  766.             D'une  maniere  generale,  le  nombre  de  termes  generes  au
  767.        paragraphe  precedent  est  superieur  au  nombre  de valeurs de la
  768.        sorte. A titre d'exemple, il existe deux  valeurs  booleennes  mais
  769.        l'ensemble  de  termes  booleens  a un nombre infini d'elements. Il
  770.        existe cependant une possibilite d'etablir  des  regles  specifiant
  771.        quels  sont les termes consideres comme designant la m | me valeur.
  772.        Ces regles sont appelees equations et font  l'objet  du  paragraphe
  773.        suivant.  Deux  types  particuliers d'equations, les axiomes et les
  774.        equations   conditionnelles,   font   l'objet    des    S D.6.1.4.2
  775.        et D.6.1.4.3.
  776.  
  777.             Les equations, les axiomes et  les  equations  conditionnelles
  778.        sont  donnes,  dans la syntaxe concrete apres le mot-cle AXIOMS. Ce
  779.        mot-cle a ete conserve pour des raisons d'ordre historique.
  780.  
  781.  
  782.        D.6.1.4.1  Equations
  783.  
  784.  
  785.             Une equation indique quels sont les  termes  consideres  comme
  786.        designant  la m | me valeur. Une equation relie deux termes separes
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.        par le symbole d'equivalence ==.
  797.  
  798.             Par exemple  <<Not(True) == False>>  indique  que  les  termes
  799.        Not(True)  et  False  sont equivalents; chaque fois que l'on trouve
  800.        Not(True), on peut le remplacer par False sans changement  de  sens
  801.        et vice versa.
  802.  
  803.             Dans certaines equations, l'ensemble de termes est  divise  en
  804.        sous-ensembles  discontinus  de  termes  qui  designent  la  m | me
  805.        valeur. Ces sous-ensembles sont appeles classes d'equivalence. Dans
  806.        le  langage courant, les classes d'equivalence sont identifiees aux
  807.        valeurs.
  808.  
  809.  
  810.                Exemples:
  811.  
  812.  
  813.                a)         L'ensemble de termes de la sorte  booleenne  est
  814.        divise en deux classes d'equivalence de termes par les deux axiomes
  815.        suivants:
  816.  
  817.                Not(True)         == False;
  818.  
  819.                Not(False)         == True;
  820.  
  821.                Les classes d'equivalence qui en resultent sont:
  822.  
  823.                { rue, Not(False), Not(Not(True)), Not(Not(Not(False))),
  824.  
  825.        Not(Not(Not(Not(True)))), Not(Not(Not(Not(Not(False))))), . |  | }
  826.  
  827.                et
  828.  
  829.                { alse, Not(True), Not(Not(False)), Not(Not(Not(True))),
  830.  
  831.        Not(Not(Not(Not(False)))), Not(Not(Not(Not(Not(True))))) }  . |  |
  832.  
  833.                Ces deux classes d'equivalence sont identifiees aux valeurs
  834.        True (Vrai) et False (Faux);
  835.  
  836.                b)          Dans  le  cas  de  couleurs,  on  peut  desirer
  837.        specifier  que  le  melange d'une couleur primaire avec une couleur
  838.        qui contient cette couleur primaire ne fait pas de  difference.  De
  839.        plus,  l'ordre  dans  lequel  les  primaires sont melanges est sans
  840.        importance. Cela peut  | tre enonce dans les equations suivantes:
  841.  
  842.                Mix(Red, Take(Red))         == Take(Red);
  843.  
  844.                Mix(Red,   Mix(Red,    Take(Green)))            == Mix(Red,
  845.        Take(Green));
  846.  
  847.                Mix(Red,    Mix(Red,    Take(Blue)))             == Mix(Red
  848.        Take(Blue));
  849.  
  850.                Mix(Red,   Mix(Green,   Take(Red)))           == Mix(Green,
  851.        Take(Red));
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.                Mix(Red,   Mix(Blue,    Take(Red)))            == Mix(Blue,
  863.        Take(Red)); etc.
  864.  
  865.                 Cela demande beaucoup de travail car des  equations  simi-
  866.        laires  apparaissent  pour toutes les permutations de Red, Green et
  867.        Blue. C'est pourquoi le LDS comporte la  construction  FOR-ALL  qui
  868.        introduit  les noms de valeur representant une classe d'equivalence
  869.        arbitraire (ou la valeur associee a  cette  classe  d'equivalence).
  870.        Cela peut  | tre tres utile dans la situation ci-dessus; toutes les
  871.        equations susmentionnees et celles qui sont indiquees par etc. peu-
  872.        vent  | tre decrites en quelques lignes sous la forme suivante:
  873.  
  874.                FOR ALL p1, p2 IN Primary _colour
  875.  
  876.                /*1*/   Mix(p1, Take(p1)) == Take(p1);
  877.  
  878.                /*2*/   Mix(p1, Mix(p1, Take(p2))) == Mix(p1, Take(p2));
  879.  
  880.                /*3*/   Mix(p1, Mix(p2, Take(p1))) == Mix(p2, Take(p1));
  881.  
  882.                /*4*/   Mix(p1, Take(p2)) == Mix(p2, Take(p1));
  883.  
  884.                /*4*/    FOR ALL c IN Colour
  885.  
  886.                /*5*/   ( Mix(p1, Mix(p2, c)) == Mix(p2, Mix(p1, c));
  887.  
  888.                /*6*/       (     Mix(p1,    Mix(p2,     c)) == Mix(Mix(p1,
  889.        Take(p2)) c))
  890.  
  891.                /*4*/    )
  892.  
  893.                 Dans les equations ci-dessus, il y  a  chevauchement  mais
  894.        cela  ne  pose pas de problemes pour autant que les equations ne se
  895.        contredisent pas mutuellement.
  896.  
  897.                   Les   equations   susmentionnees   creent   7    classes
  898.        d'equivalence  dans  l'ensemble  de  termes  de la sorte Colour, de
  899.        sorte qu'avec ces equations, il y a sept valeurs de  couleurs.  Les
  900.        termes suivants sont dans les classes d'equivalence differentes:
  901.  
  902.                Take(Red), Take(Green), Take(Blue),
  903.  
  904.                Take(Red, Take(Green)),
  905.  
  906.                Mix(Green, Take(Blue)),
  907.  
  908.                Mix(Blue, Take(Red)),
  909.  
  910.                Mix(Blue, Mix(Green, Take(Red))).
  911.  
  912.                 Tous les autres termes de la sorte Colour sont equivalents
  913.        a l'un des termes ci-dessus.
  914.  
  915.                Dans les exemples d'equations  comportant  la  construction
  916.        FOR-ALL,     appelees    equations    explicitement    quantifiees,
  917.        l'information que p1 et p2 sont des identificateurs  de  valeur  de
  918.        sorte  Primary  _colour  est  redondante; l'argument de l'operateur
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.        Take et le premier argument de l'operateur Mix ne peuvent  | tre de
  929.        la  sorte  Primary _colour. En general, les equations explicitement
  930.        quantifiees deviennent plus lisibles mais il est possible d'omettre
  931.        la quantification si la sorte des identificateurs de valeur peut
  932.         | tre deduite du contexte. Dans ce cas, on dit que l'equation  est
  933.        implicitement quantifiee.
  934.  
  935.  
  936.                Exemple:
  937.  
  938.  
  939.                Les equations 4 et 5 ci-dessus sont les m | mes que:
  940.  
  941.                Mix(p1, Take(p2)) , c))    == Mix(p2, Take(p1));
  942.  
  943.                Mix(p1, Mix(p2, c))   == Mix(p2, Mix(p1, c));
  944.  
  945.  
  946.        D.6.1.4.2  Axiomes
  947.  
  948.  
  949.             Les  axiomes  sont  simplement   des   especes   particulieres
  950.        d'equation, introduites parce que dans des situations pratiques, de
  951.        nombreuses equations se rapportent a des booleens. Dans ce cas, les
  952.        equations  tendent  a  prendre  la  forme .  |   |  == True (vrai),
  953.        c'est-a-dire qu'elles indiquent qu'un terme donne est equivalent  a
  954.        True.
  955.  
  956.  
  957.                Exemple:
  958.  
  959.  
  960.                Admettons qu'un operateur  soit  defini  pour  une  couleur
  961.        type:  Contains:  Colour,  Primary  _colour->  Boolean; ce qui doit
  962.        donner la reponse True (vrai) si la couleur primaire  est  contenue
  963.        dans  la  couleur  et  False (faux) dans le cas contraire. Voici un
  964.        exemple des equations dont il s'agit:
  965.  
  966.                FOR ALL p IN Primary _colour
  967.  
  968.                ( Contains(Take(p), p)         == True;
  969.  
  970.                FOR ALL c IN Colour
  971.  
  972.                ( Contains(Mix(p,c), p)         == True)
  973.  
  974.                )
  975.  
  976.                La partie <<== True>> de ces equations peut  | tre omise et
  977.        les  resultats sont appeles axiomes. Des axiomes peuvent se reconna
  978.        | tre a l'absence du symbole d'equivalence ==;  ils  designent  des
  979.        termes  qui  sont  equivalents  a la valeur True (vrai) de la sorte
  980.        booleenne.
  981.  
  982.                 La construction de la seconde equation  peut  para  |  tre
  983.        quelque  peu  forcee.  Une meilleure maniere d'ecrire ces equations
  984.        est  indiquee  apres  l'introduction  de  certaines   constructions
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992.  
  993.  
  994.        utiles.
  995.  
  996.  
  997.        D.6.1.4.3   Equations conditionnelles
  998.  
  999.  
  1000.             Les equations conditionnelles constituent  un  moyen  d'ecrire
  1001.        des  equations  qui ne sont valables que dans certaines conditions.
  1002.        Ces conditions sont designees par la m | me syntaxe que  les  equa-
  1003.        tions  non  conditionnelles  et sont separees par un symbole ==> de
  1004.        l'equation qui est valable si la condition est remplie.
  1005.  
  1006.  
  1007.                Exemple:
  1008.  
  1009.  
  1010.                  L'exemple  type  d'une  equation  conditionnelle  est  la
  1011.        definition de la division en type reel ou:
  1012.  
  1013.                FOR ALL x, z IN Real
  1014.  
  1015.                (  z/= 0 == True    ==>    (x/z) * z == x)
  1016.  
  1017.                 indique que, si la condition <<z n'est pas egale a 0>> est
  1018.        valable,  la division par z suivie de la multiplication par z donne
  1019.        la valeur originale. Cette equation conditionnelle  n'indique  rien
  1020.        quant a ce qui devrait arriver si une valeur de la sorte Real etait
  1021.        divisee par 0. Si l'on veut specifier ce qui se  passe  en  cas  de
  1022.        division par zero, il faudrait creer une equation conditionnelle de
  1023.        la forme suivante:
  1024.  
  1025.                FOR ALL x, z IN Real
  1026.  
  1027.                (  z = 0 == True    ==>    (x/z) * z == . |  | ).
  1028.  
  1029.                En pareil cas, cependant, il est recommande  de  placer  un
  1030.        <<terme  conditionnel>> du c | te droit, pour faciliter la lecture.
  1031.        Dans le cas ci-dessus l'equation deviendrait:
  1032.  
  1033.                FOR ALL x, z IN Real
  1034.  
  1035.                (  (x/z) * z    ==   IF z/=0
  1036.  
  1037.                (  (x/z) * z    ==    THEN x
  1038.  
  1039.                (  (x/z) * z    ==    ELSE . |  |
  1040.  
  1041.                (  (x/z) * z    ==    FI
  1042.  
  1043.                )
  1044.  
  1045.  
  1046.        D.6.1.5          Informations complementaires concernant les  equa-
  1047.        tions et les axiomes
  1048.  
  1049.  
  1050.             Les  deux  sections  qui   suivent   traitent   de   certaines
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.        difficultes que l'on peut rencontrer lorsque des operateurs donnent
  1061.        des resultats appartenant a une sorte deja definie. Le  S D.6.1.5.3
  1062.        explique la notion d'erreur en tant que terme d'une equation.
  1063.  
  1064.  
  1065.        D.6.1.5.1  Coherence de la hierarchie
  1066.  
  1067.  
  1068.             En un point quelconque d'une specification en LDS,  il  existe
  1069.        une seule et unique definition de type de donnees. Cette definition
  1070.        de type de donnees contient les  sortes,  operateurs  et  equations
  1071.        predefinis  et  l'ensemble  des  sortes,  operateurs  et  equations
  1072.        definis par l'utilisateur dans les definitions de  type  partielles
  1073.        visibles  en  ce  point.  (C'est  la  raison pour laquelle un texte
  1074.        NEWTYPE . |  |  ENDNEWTYPE est appele definition de type  partielle
  1075.        .)
  1076.  
  1077.             Il en resulte certaines consequences pour les  definitions  de
  1078.        type  aux  niveaux inferieurs. Cette influence sur le type pourrait
  1079.        | tre peu souhaitable. A titre d'exemple, on pourrait specifier  de
  1080.        facon  erronee  que deux termes sont equivalents, les rendant ainsi
  1081.        equivalents alors qu'ils ne sont pas dans une portee englobante.
  1082.  
  1083.             Il n'est pas admis de donner des equations telles que:
  1084.  
  1085.                a)         les valeurs d'une  sorte  qui  sont  differentes
  1086.        dans une portee a un niveau superieur soient rendues equivalentes;
  1087.  
  1088.                b)         de nouvelles valeurs soient ajoutees a une sorte
  1089.        definie dans une portee de niveau superieur.
  1090.  
  1091.             Cela signifie par exemple que,  dans  un  bloc  au  niveau  du
  1092.        systeme,   des   definitions  de  type  partielles  specifiees  par
  1093.        l'utilisateur contenant un operateur ayant  un  resultat  predefini
  1094.        doivent  rapporter tous les termes produits par cet operateur a des
  1095.        valeurs de cette sorte de resultat.
  1096.  
  1097.  
  1098.                Exemples:
  1099.  
  1100.  
  1101.                a)          Si,  pour  une  raison  quelconque,  on   donne
  1102.        l'axiome:
  1103.  
  1104.                FOR ALL n, m IN Integer
  1105.  
  1106.                ( (Fact(n) = Fact(m))    =>    (n = m))
  1107.  
  1108.                 afin de specifier que si les resultats de l'operateur Fact
  1109.        sont  les  m  | mes, les arguments sont alors les m | mes. (A noter
  1110.        que => est l'implication booleenne; cela a peu de relation avec  le
  1111.        signe  d'equation  conditionnellle ==>).  Ainsi,  par accident, les
  1112.        valeurs sont unifiees. Des equations  des  exemples  precedents  on
  1113.        peut  deduire  que  Fact(0)   = Fact(1)  et cette derniere equation
  1114.        indique que 0 et 1 sont des notations differentes  de  la  m  |  me
  1115.        valeur. Sur la base de cette derniere equation, on peut prouver que
  1116.        les nombres d'elements de la sorte Integer sont reduits a un.
  1117.  
  1118.  
  1119.  
  1120.  
  1121.  
  1122.  
  1123.  
  1124.  
  1125.  
  1126.                 Avec l'aide d'une equation conditionnelle, on  peut  indi-
  1127.        quer  que,  pourvu  que n  et m  ne soient pas egaux a 0, le m | me
  1128.        resultat de l'operateur Fact sur n et m implique n = m. En Led:
  1129.  
  1130.                FOR ALL n, m IN Integer
  1131.  
  1132.                ( n/=0, m/=0 ==> (Fact(n) = Fact(m))    =>    (n = m))
  1133.  
  1134.                A noter que cette derniere  equation  n'ajoute  rien  a  la
  1135.        semantique  des  nombres entiers; c'est un theoreme qui peut  | tre
  1136.        deduit des autres equations. Par ailleurs, l'adjonction d'une equa-
  1137.        tion prouvable ne presente pas d'inconvenient.
  1138.  
  1139.                b)          Admettons que l'on decouvre la  necessite  d'un
  1140.        operateur  pour les factorielles lors de la specification d'un type
  1141.        donne. Dans la definition de type partielle de ce type, l'operateur
  1142.        Fact est introduit:
  1143.  
  1144.                Fact: Integer -> Integer;
  1145.  
  1146.                et les equations suivantes sont donnees  pour  definir  cet
  1147.        operateur:
  1148.  
  1149.                Fact(0) == 1;
  1150.  
  1151.                FOR ALL n IN Integer
  1152.  
  1153.                ( n > 0 ==> Fact(n) == n * Fact(n-1))
  1154.  
  1155.                 Ces equations ne definissent pas Fact(-1) et ainsi,  c'est
  1156.        un  terme de la sorte Integer qui n'a pas de relation avec d'autres
  1157.        termes de cette sorte. En consequence, Fact(-1)  est  une  nouvelle
  1158.        valeur  de  la  sorte  entier (et il en va de m | me pour Fact(-2),
  1159.        Fact(-3), etc). Cela n'est pas admis. L'exemple b)  du  S D.6.1.5.3
  1160.        donne une definition correcte de fact.
  1161.  
  1162.  
  1163.        D.6.1.5.2   Egalite et inegalite
  1164.  
  1165.  
  1166.             Dans chaque type, les operateurs d'egalite et d'inegalite sont
  1167.        implicites.  Ainsi,  si  une definition de type partielle introduit
  1168.        une sorte S, il y a alors des definitions implicites d'operateur:
  1169.  
  1170.                "=": S, S -> Boolean;
  1171.  
  1172.                "/=": S, S -> Boolean;
  1173.  
  1174.             (Remarque  -   Les  guillemets  specifient  que  =  et/=  sont
  1175.        utilises comme operateurs infixes.)
  1176.  
  1177.             L'operateur d'egalite presente les proprietes previsibles:
  1178.  
  1179.             a = a,
  1180.  
  1181.             a = b => b = a,
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.             a = b AND b = c => a = c,
  1193.  
  1194.             a = b => a == b,
  1195.  
  1196.             a = b => op(a) = op(b) for all operators op.
  1197.  
  1198.             Ces proprietes ne sont  pas  ecrites  en  syntaxe  LDS  et  ne
  1199.        doivent pas
  1200.         | tre enoncees dans des axiomes ou des equations  car  elles  sont
  1201.        implicites.  La  valeur booleenne obtenue lorsque cet operateur est
  1202.        applique est True (vrai) si les termes de la partie gauche et de la
  1203.        partie  droite sont de m | me classe d'equivalence; sinon la valeur
  1204.        obtenue est False (faux). S'il n'est  pas  explicitement  specifie,
  1205.        que la valeur est True (vrai) ou False (faux), la specification est
  1206.        incomplete.
  1207.  
  1208.             Pour l'operateur d'inegalite, c'est par une  equation  en  LDS
  1209.        que l'on peut le mieux expliquer la semantique:
  1210.  
  1211.                FOR ALL a, b IN S
  1212.  
  1213.                ( a/= b == Not(a = b))
  1214.  
  1215.             Il n'y a pas de difference entre l'egalite  et  l'equivalence.
  1216.        Deux  termes  qui  sont  equivalents  designent la m | me valeur et
  1217.        l'operateur d'egalite entre eux donne le resultat True (vrai).
  1218.  
  1219.  
  1220.        D.6.1.5.3   Erreur
  1221.  
  1222.  
  1223.             On a juge necessaire, pour  les  exemples  qui  precedent,  de
  1224.        specifier  que l'application de l'operateur a certaines valeurs est
  1225.        consideree comme une erreur. Le LDS a un moyen de le specifier for-
  1226.        mellement: l'element ERROR. L'erreur devrait servir a exprimer:
  1227.  
  1228.                 <<l'application de cet operateur a cette valeur n'est  pas
  1229.        admise   et  lorsqu'il  se  presente,  le  comportement  futur  est
  1230.        indefini>>.
  1231.  
  1232.             Dans la syntaxe  concrete,  cela  est  indique  par  le  terme
  1233.        Error!, qui ne peut  | tre utilise comme argument d'un operateur.
  1234.  
  1235.             Lorsque Error resulte de l'application d'un operateur  et  que
  1236.        cette   application   est   un   argument   d'un  autre  operateur,
  1237.        l'application d'operateur exterieur porte egalement Error dans  son
  1238.        resultat  (propagation-d'erreurs).  Dans  un terme conditionnel, la
  1239.        partie THEN ou la partie ELSE  est  evaluee,  de  sorte  que  l'une
  1240.        d'elle peut  | tre une erreur sans que celle-ci soit evaluee (etant
  1241.        donnee que l'autre partie de l'alternative est evaluee).
  1242.  
  1243.  
  1244.                Exemples:
  1245.  
  1246.  
  1247.                a)         Dans l'exemple de division de valeurs  de  sorte
  1248.        Real, les poids peuvent  | tre remplaces comme suit:
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.                FOR ALL x, z IN Real
  1259.  
  1260.                ( (x/z) * z == IF z/=0
  1261.  
  1262.                ( (x/z) * z ==  THEN    x
  1263.  
  1264.                ( (x/z) * z ==  ELSE    Error!
  1265.  
  1266.                ( (x/z) * z ==  FI
  1267.  
  1268.                )
  1269.  
  1270.                Pour plus de clarte, on pourrait ajouter:
  1271.  
  1272.                FOR ALL x IN Real
  1273.  
  1274.                ( x/0 == Error!)
  1275.  
  1276.                b)         Dans l'exemple comportant l'operateur  Fact,  on
  1277.        pourrait  specifier  que  l'application  de  cet  operateur sur des
  1278.        entiers negatifs est consideree comme une erreur (Error). Cela per-
  1279.        met  d'eviter  que  Fact(-1),  Fact(-2), .  |   |  ne deviennent de
  1280.        nouvelles valeurs de la sorte Integer (entier). Il conviendrait  de
  1281.        definir l'operateur Fact comme suit:
  1282.  
  1283.                n < 0         ==>         Fact(n) == Error!;
  1284.  
  1285.                Fact(0) == 1;
  1286.  
  1287.                n > 0         ==>         Fact(n) == Fact(n-1) * n;
  1288.  
  1289.                 Ces trois lignes sont beaucoup plus claires que l'equation
  1290.        du style programmation indiquee ci-apres. En general, le terme con-
  1291.        ditionnel devrait  | tre utilise s'il y a deux cas complementaires;
  1292.        l'embo  |  tage  de termes conditionnels rend l'equation illisible,
  1293.        comme on peut le voir ci-dessous:
  1294.  
  1295.                Fact(n)   ==   IF n > 0
  1296.  
  1297.                Fact(n)   ==    THEN Fact(n-1) * n
  1298.  
  1299.                Fact(n)   ==    ELSE  IF n = 0
  1300.  
  1301.                Fact(n)   ==   ELSE   THEN 1
  1302.  
  1303.                Fact(n)   ==   ELSE   ELSE Error!
  1304.  
  1305.                Fact(n)   ==   ELSE   FI
  1306.  
  1307.                Fact(n)   ==    FI
  1308.  
  1309.  
  1310.        D.6.2         Generateurs et heritage
  1311.  
  1312.  
  1313.             Le present paragraphe traite de deux constructions qui peuvent
  1314.         | tre  utilisees  pour  specifier  des  types  ayant  des  parties
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.        communes.  Le  generateur  specifie non un type mais un schema, qui
  1325.        devient un type lorsque les sortes, operateurs, litteraux  et  con-
  1326.        stantes formels sont remplaces par des termes reels.
  1327.  
  1328.             L'heritage offre la possibilite de creer un  nouveau  type  en
  1329.        partant   d'un  type  deja  existant.  Les  noms  de  litteraux  et
  1330.        d'operateurs  peuvent   |  tre  renommes  et  il  est  possible  de
  1331.        specifier   des   litteraux,   des   operateurs  et  des  equations
  1332.        supplementaires.
  1333.  
  1334.  
  1335.        D.6.2.1         Generateurs
  1336.  
  1337.  
  1338.             Une definition de generateur definit un schema  parametre  par
  1339.        des  noms  formels  de  sortes,  de  litteraux,  de  constantes  et
  1340.        d'operateurs.  Les  generateurs  sont  destines  a  des  types  qui
  1341.        representent  des  <<variations sur un theme>>, tels que des ensem-
  1342.        bles  d'elements,  des  cha  |   nes   d'elements,   des   fichiers
  1343.        d'enregistrement, des tables de consultation, des tableaux.
  1344.  
  1345.             On peut l'expliquer a l'aide  d'un  exemple  pour  lequel  des
  1346.        variations   peuvent    |  tre  envisagees.  Admettons  qu'il  soit
  1347.        necessaire qu'un type  ressemble  a  la  notion  mathematique  d'un
  1348.        ensemble  d'entiers.  La partie suivante du texte fait partie de la
  1349.        definition de type de cet ensemble d'entiers.
  1350.  
  1351.  
  1352.                            Figure D.6.2.1 (comme tableau) [T37.100], p. 10
  1353.  
  1354.  
  1355.  
  1356.  
  1357.             Toutes les equations  ont  une  quantification  implicite.  La
  1358.        premiere  equation  indique  que  la  suppression  d'un  element de
  1359.        l'ensemble vide donne l'ensemble vide  pour  resultat.  La  seconde
  1360.        equation  indique  que  la  suppression  apres  insertion du m | me
  1361.        element donne  pour  resultat  l'ensemble  tel  qu'il  etait  avant
  1362.        l'insertion   (a   condition   que   l'ensemble  ne  contienne  pas
  1363.        l'element); sinon l'ordre d'insertion et de suppression peut  | tre
  1364.        interchangeable.  La  troisieme equation indique que l'element vide
  1365.        ne contient pas d'elements. La  quatrieme  equation  indique  qu'un
  1366.        element  se  trouve  dans  un  ensemble s'il est le dernier element
  1367.        ajoute ou s'il se trouvait dans l'ensemble  avant  l'adjonction  du
  1368.        dernier   element.   La   derniere  equation  indique  que  l'ordre
  1369.        d'addition des elements ne fait aucune difference.
  1370.  
  1371.             Dans  l'exemple  de  la  figure  D-6.2.1  Int  _set  (ensemble
  1372.        _d'entiers)  n'est  qu'un exemple d'un ensemble et si l'on a egale-
  1373.        ment  besoin  d'un  PId  _set,  d'un  Subscriber   _set   (ensemble
  1374.        _d'abonnes)  et  d'un  Exchange  _name _set (ensemble _de _noms _de
  1375.        _central) dans la specification, personne  ne  sera  surpris  qu'il
  1376.        contienne  tous les operateurs Add (ajouter), Delete (supprimer) et
  1377.        Is _in (est _dans) et un litteral pour l'ensemble vide.  Les  equa-
  1378.        tions  donnees  pour  ces operateurs facilitent la generalisation a
  1379.        d'autres ensembles.
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.             Tel est le cas ou la notion de generateur se revele utile;  le
  1391.        texte commun peut  | tre donne une fois et  | tre utilise plusieurs
  1392.        fois. La figure D-6.2.2 presente le generateur. (A  noter  que  les
  1393.        noms  de  sortes  formels sont introduits par le mot cle TYPE, cela
  1394.        uniquement pour des raisons d'ordre historique.)
  1395.  
  1396.             Au lieu d'utiliser Integer (entier), on utilise le type formel
  1397.        Item  et,  pour  pouvoir donner differents noms a l'ensemble entier
  1398.        vide et aux ensembles vides dans d'autres types, on fait  egalement
  1399.        de ce litteral un parametre formel.
  1400.  
  1401.  
  1402.                            Figure D.6.2.2 (comme tableau) [T38.100], p. 11
  1403.  
  1404.  
  1405.  
  1406.             Avec ce generateur, le type Int _set  peut   |  tre  construit
  1407.        comme suit:
  1408.  
  1409.                NEWTYPE Int _set Set (Integer, empty _int _set)
  1410.  
  1411.                ENDNEWTYPE Int _set;
  1412.  
  1413.             Si l'on compare les figures D-6.2.1 et  D-6.2.2,  on  constate
  1414.        que:
  1415.  
  1416.                a)         GENERATOR et  ENDGENERATOR  sont  remplaces  par
  1417.        NEWTYPE et ENDNEWTYPE respectivement;
  1418.  
  1419.                b)         les parametres formels de generateur  (le  texte
  1420.        entre parentheses apres le nom de generateur) sont supprimes;
  1421.  
  1422.                c)         Set, Item et empty _set sont remplaces dans tout
  1423.        le generateur par Int _set, Integer et empty _int _set, respective-
  1424.        ment.
  1425.  
  1426.             Ainsi, il n'y a en fait aucune difference entre cet  Int  _set
  1427.        et celui de la figure D-6.2.1, mais . |  |
  1428.  
  1429.                -          si l'on a besoin d'un ensemble de  valeurs  Pid,
  1430.        on peut creer le type a l'aide de:
  1431.  
  1432.                NEWTYPE PId-set Set(PId, empty _pid _set)
  1433.  
  1434.                ENDNEWTYPE PId _set;
  1435.  
  1436.                -         si l'on a besoin d'un  ensemble  d'abonnes,  dans
  1437.        lequel  les  abonnes  sont  representes par un type introduisant la
  1438.        sorte Subscr, l'ensemble d'abonnes peut  | tre cree a l'aide de:
  1439.  
  1440.                NEWTYPE Subscr _set Set(Subscr, empty _subscr _set)
  1441.  
  1442.                ENDNEWTYPE Subscr _set;
  1443.  
  1444.                 Cela permet d'economiser du papier, de  plus,  le  travail
  1445.        est facilite parce qu'il suffit de penser une fois aux ensembles et
  1446.        que ce travail peut
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.         | tre delegue a  des  specialistes  qualifies  sur  les  types  de
  1457.        donnees abstraites.
  1458.  
  1459.  
  1460.                Exemple:
  1461.  
  1462.  
  1463.                Cet exemple montre un generateur utilisant  une  sorte,  un
  1464.        operateur,  un  litteral  et  une  constante formels. Il decrit une
  1465.        rangee d'elements ayant une longueur maximale max _length. La sorte
  1466.        comprend  un  litteral  designant  la rangee vide et les operateurs
  1467.        pour insertion et suppression d'elements  dans  une  rangee  ou  de
  1468.        celle-ci,  l'encha  | nement de rangees, le choix d'une sous-rangee
  1469.        et la  determination  de  la  longueur  d'une  rangee.  Ce  dernier
  1470.        operateur est rendu formel ce qui permet de la nommer a nouveau.
  1471.  
  1472.                GENERATOR Row (TYPE Item, OPERATOR Length, LITERAL Empty,
  1473.  
  1474.                            CONSTANT max _length)
  1475.  
  1476.                  LITERALS Empty
  1477.  
  1478.                  OPERATORS
  1479.  
  1480.                    Length: Row         -> Integer;
  1481.  
  1482.                    Insert: Row, Item, Integer         -> Row;
  1483.  
  1484.                    Delete: Row, Integer, Integer         -> Row;
  1485.  
  1486.                    "//": Row, Row         -> Row;
  1487.  
  1488.                    Select: Row, Integer, Integer         -> Row
  1489.  
  1490.                    /* and other operators relevant for rows of items */
  1491.  
  1492.                  AXIOMS
  1493.  
  1494.                    /* The equations for the operators above, among *
  1495.  
  1496.                    / * which the following two (or equivalents) */
  1497.  
  1498.                    Length(r) = max _length  ==>  Insert(r,  itm,  int)  ==
  1499.        Error!;
  1500.  
  1501.                    Length(r1) + Length(r2) > max  _length  ==>  r1//r2  ==
  1502.        Error!
  1503.  
  1504.                ENDGENERATOR Row;
  1505.  
  1506.                A noter que l'operateur  formel  Length  (longueur)  et  le
  1507.        litteral Empty (vide) sont donnes une fois de plus dans le corps du
  1508.        generateur parce qu'ils sont renommes lors de  leur  instantiation.
  1509.        Dans  le  cas de l'operateur, les arguments et la sorte de resultat
  1510.        ne sont donnes que dans le corps. Le generateur Row  (rangee)  peut
  1511.        servir a faire des lignes, des pages et des livres, comme suit:
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.                NEWTYPE Line Row(Character, Width, Empty _line, 80)
  1523.  
  1524.        ENDNEWTYPE Line;
  1525.  
  1526.                NEWTYPE Page Row(Line, Length, Empty _page, 66)
  1527.  
  1528.        ENDNEWTYPE Page;
  1529.  
  1530.                NEWTYPE Book Row(Page, Nr _of _pages, Empty _book, 10000)
  1531.  
  1532.        ENDNEWTYPE Book;
  1533.  
  1534.  
  1535.        D.6.2.2         Heritage
  1536.  
  1537.  
  1538.             L'heritage constitue un moyen d'etablir toutes les valeurs  de
  1539.        la  sorte  dite  parente,  certains  ou tous les operateurs du type
  1540.        parent et toutes les equations du type parent. Pour  les  litteraux
  1541.        et  les  operateurs,  il  existe  une  possibilite  de les nommer a
  1542.        nouveau. En general, c'est une  methode  satisfaisante  parce  que,
  1543.        dans  ce cas, le lecteur peut deduire du contexte qu'il s'agit d'un
  1544.        autre type, m | me si les litteraux sont les m | mes.
  1545.  
  1546.             Si  un  operateur  n'est   pas   herite,   on   lui   attribue
  1547.        systematiquement un autre nom inaccessible a l'utilisateur. Le fait
  1548.        que les operateurs sont encore presents  signifie  que  toutes  les
  1549.        equations du type parent sont encore presentes (avec des operateurs
  1550.        portant un autre nom). Cela garantit que les valeurs parentes  sont
  1551.        heritees.
  1552.  
  1553.             Avec la possibilite d'emp | cher l'utilisation d'un  operateur
  1554.        (lorsqu'il n'est pas herite), on assure la possibilite d'ajouter de
  1555.        nouveaux operateurs. Apres le mot cle ADDING, on  peut  donner  des
  1556.        litteraux, des operateurs et des equations comme dans un type ordi-
  1557.        naire. Toutefois, il faut faire attention aux nouveaux litteraux et
  1558.        aux confusions possibles entre operateurs herites et ajoutes.
  1559.  
  1560.             Lorsque les litteraux sont ajoutes, le resultat des operateurs
  1561.        herites,  appliques  a  des  nouveaux litteraux, doit  | tre defini
  1562.        (par des equations). Lorsque des operateurs  sont  ajoutes,  il  ne
  1563.        faut pas oublier les operateurs nommes a nouveau de maniere invisi-
  1564.        ble et les equations associees. Les  equations  de  definition  des
  1565.        operateurs  ajoutes devraient  | tre compatibles avec les equations
  1566.        comportant des operateurs herites et non herites.
  1567.  
  1568.             Apres cette liste d'avertissements, prenons quelques exemples:
  1569.  
  1570.                a)          Supposons que le newtype couleur est complet et
  1571.        disponible.  Ce  type est fonde sur le choix et le melange de fais-
  1572.        ceaux de lumiere  de  couleur  primaire.  Il  faudrait  de  longues
  1573.        reflexions  et un long texte et/ou copie pour definir quelque chose
  1574.        de semblable pour le choix et le melange de peinture.
  1575.  
  1576.                Une solution commode a ce  probleme  consiste  a  faire  du
  1577.        newtype  Colour  (couleur)  un  generateur en effectuant uniquement
  1578.        deux remplacements:
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.                1)         la premiere ligne
  1589.  
  1590.                  NEWTYPE Colour
  1591.  
  1592.                devient
  1593.  
  1594.                  GENERATOR Colour (TYPE Primary _colour)
  1595.  
  1596.                2)         le mot-cle ENDNEWTYPE devient ENDGENERATOR.
  1597.  
  1598.                  On  peut  maintenant  nommer  a  nouveau  le   generateur
  1599.        lorsqu'il  est instancie. Supposons que la sorte anterieure Primary
  1600.        _colour soit appelee  Light _primary, et que la sorte  Paint  _pri-
  1601.        mary soit definie comme:
  1602.  
  1603.                NEWTYPE Paint _primary
  1604.  
  1605.                  LITERALS Red, Yellow, Blue
  1606.  
  1607.                ENDNEWTYPE Paint _primary;
  1608.  
  1609.             Il est maintenant tres facile  de  definir  deux  types  simi-
  1610.        laires, un pour la lumiere et un pour la peinture:
  1611.  
  1612.                NEWTYPE Light _colours Colour (Light _primary) ENDNEWTYPE;
  1613.  
  1614.                NEWTYPE Paint _colours Colour (Paint _primary) ENDNEWTYPE;
  1615.  
  1616.             Il n'y a pas de probleme jusqu'ici, mais comment peut-on  voir
  1617.        la  difference  entre Take (Red) de Light _colour et celui de Paint
  1618.        _colour avec la m | me syntaxe? S'il est necessaire  de  distinguer
  1619.        entre  ces deux termes, on peut avoir recours a l'heritage. Au lieu
  1620.        de Light _colours et Paint _colours, les types Light  (lumiere)  et
  1621.        Palette  sont  definis  par  heritage et le nom de l'operateur Take
  1622.        (prendre) est modifie:
  1623.  
  1624.                NEWTYPE Light
  1625.  
  1626.                  INHERITS Light _colours
  1627.  
  1628.                  OPERATORS (Beam=Take, Mix, Contains)
  1629.  
  1630.                  ADDING
  1631.  
  1632.                    LITERALS White
  1633.  
  1634.                    AXIOMS
  1635.  
  1636.                      White == Mix (Red, Mix (Yellow, Beam (Blue)))
  1637.  
  1638.                ENDNEWTYPE Light;
  1639.  
  1640.                Maintenant le newtype Light (lumiere) a  les  litteraux  de
  1641.        Light _colours et le litteral White (blanc). Light _colours n'a pas
  1642.        de litteraux qui lui soient propres (car il utilise  les  litteraux
  1643.        de  Light  _primary),  de  sorte  que White est le seul litteral de
  1644.        Light. Les operateurs et les equations de Light sont les  m  |  mes
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.        que  ceux  de  Light  _colours,  a  l'exception  du fait que le nom
  1655.        d'operateur Take est remplace par Beam (faisceau) et que l'equation
  1656.        pour  White  a ete ajoutee. L'axiome ajoute indique que ce litteral
  1657.        ajoute devient un element de l'ensemble de termes dans  lequel  les
  1658.        trois couleurs primaires sont melangees.
  1659.  
  1660.                Le newtype Palette a les litteraux  de  Paint  _colours  et
  1661.        l'operateur Take est remplace par Paint (peinture):
  1662.  
  1663.                NEWTYPE Palette
  1664.  
  1665.                  INHERITS Paint _colours
  1666.  
  1667.                  OPERATORS (Paint _Take, Mix, Contains)
  1668.  
  1669.                ENDNEWTYPE Palette;
  1670.  
  1671.                b)         Admettons que l'on veuille etendre l'ensemble de
  1672.        types   entiers   (sorte  Int  _set),  introduit  dans  la  section
  1673.        precedente, par un operateur qui trouve le  plus  petit  entier  de
  1674.        l'ensemble. Tout d'abord, il faut se demander si cet operateur peut
  1675.        | tre introduit dans la definition de  generateur  pour  le  rendre
  1676.        disponible a tous les ensembles et autres choses.
  1677.  
  1678.                S'il est vrai que cela peut  | tre  fait,  cela  limiterait
  1679.        l'element  a  la  definition de > et <. Cela ne convient pas a tous
  1680.        les elements (PId par exemple) et il  peut   |  tre  preferable  de
  1681.        creer  un  newtype  ayant  la  sorte  New  _int  _set comportant un
  1682.        operateur Min.
  1683.  
  1684.                NEWTYPE New _int _set
  1685.  
  1686.                  INHERITS Int _set
  1687.  
  1688.                  OPERATORS ALL
  1689.  
  1690.                  ADDING
  1691.  
  1692.                    OPERATORS
  1693.  
  1694.                      Min: New _int _set-> Integer
  1695.  
  1696.                    AXIOMS
  1697.  
  1698.                      Min(Empty _int _set) == Error!;
  1699.  
  1700.                      Min(Add(Empty _int _set, x))==x;
  1701.  
  1702.                      Min(Add(Add(nis,x),y))==
  1703.  
  1704.                        IF y <Min(Add(nis,x))
  1705.  
  1706.                        THEN y
  1707.  
  1708.                        ELSE Min(Add(nis,x))
  1709.  
  1710.                        FI
  1711.  
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.                ENDNEWTYPE New _int _set;
  1721.  
  1722.             Etant  donne  que  l'adjonction  apres  une  instantiation  de
  1723.        generateur  est  relativement  courante,  le  texte  commencant par
  1724.        ADDING et se terminant juste avant le ENDNEWTYPE peut  | tre  donne
  1725.        a  l'interieur  de l'instantiation de generateur. On en trouvera un
  1726.        exemple au S  5.4.1.12 de la Recommandation.
  1727.  
  1728.  
  1729.        D.6.3         Observations relatives aux equations
  1730.  
  1731.  
  1732.             Lorsque l'on introduit un nouveau  type  de  donnees,  il  est
  1733.        essentiel   d'introduire   suffisamment   d'equations.   Dans   les
  1734.        paragraphes qui suivent, trois observations sont presentees concer-
  1735.        nant les equations qui en faciliteront l'etablissement.
  1736.  
  1737.  
  1738.        D.6.3.1         Conditions generales
  1739.  
  1740.  
  1741.             De quelque maniere que l'on construise les equations, il  faut
  1742.        tenir compte des faits suivants:
  1743.  
  1744.                a)          chaque operateur appara | t au moins  une  fois
  1745.        dans  l'ensemble  des  equations  (sauf  pour  les  cas  <<patholo-
  1746.        giques>>);
  1747.  
  1748.                b)         tous les enonces vrais peuvent  | tre tires  des
  1749.        equations.   Ils sont soit indiques comme des axiomes, soit deduits
  1750.        par substitution de termes equivalents dans les equations;
  1751.  
  1752.                c)          aucune  incoherence  doit    |   tre   decelee,
  1753.        c'est-a-dire   que   l'on   ne   peut  deduire  des  equations  que
  1754.        Vrai = Faux.
  1755.  
  1756.             Une procedure permettant de trouver des equations peut  |  tre
  1757.        exprimee en LDS informel, comme indique dans la figure D-6.3.1.
  1758.  
  1759.  
  1760.        D.6.3.2         Application de fonctions aux constructeurs
  1761.  
  1762.  
  1763.             D'une maniere generale,  l'ensemble  d'operateurs  possede  un
  1764.        sous-ensemble  d'operateurs  appeles  <<constructeurs>>  et <<fonc-
  1765.        tions>>. Les constructeurs peuvent  servir  a  generer  toutes  les
  1766.        valeurs  (classes  d'equivalence) de la sorte. Dans cette approche,
  1767.        les litteraux sont consideres comme des operateurs sans argument.
  1768.  
  1769.  
  1770.                Exemples:
  1771.  
  1772.  
  1773.                a)         le type booleen a ses litteraux  pour  construc-
  1774.        teurs;
  1775.  
  1776.                b)         le type naturel a le litteral 0  et  l'operateur
  1777.  
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784.  
  1785.  
  1786.        Next  comme  constructeurs;  un naturel quelconque peut  | tre con-
  1787.        struit seulement avec 0 et Next;
  1788.  
  1789.                c)         le generateur pour les ensembles a  le  litteral
  1790.        ensemble  _vide  et  l'operateur  _additif  comme constructeurs; un
  1791.        ensemble quelconque ne peut  | tre construit qu'en utilisant  Empty
  1792.        _set (ensemble _vide) et Add (ajouter);
  1793.  
  1794.                d)          le type entier peut  | tre construit  au  moyen
  1795.        des litteraux 0 et  1, des operateurs + et moins unaires.
  1796.  
  1797.  
  1798.                                                 Figura D-6.3.1, (N), p. 12
  1799.  
  1800.  
  1801.             A noter qu'il y  a  parfois  plusieurs  choix  possibles  pour
  1802.        l'ensemble  de constructeurs. Tout choix sera valable pour le reste
  1803.        de la presente section mais les petits ensembles sont  generalement
  1804.        les meilleurs.
  1805.  
  1806.             Ensuite, les fonctions sont traitees une par une. Pour  chaque
  1807.        argument d'une fonction, seuls sont enumeres tous les termes possi-
  1808.        bles composes de constructeurs. Pour eviter le probleme que  posent
  1809.        les nombres infinis de termes, il faut appliquer la quantification.
  1810.  
  1811.  
  1812.                Exemples:
  1813.  
  1814.  
  1815.                a)         Pour les nombres naturels, cette liste  peut   |
  1816.        tre reduite a:
  1817.  
  1818.                0
  1819.  
  1820.                Next (n) ou n est tout nombre naturel.
  1821.  
  1822.                b)         Pour les ensembles, la liste eventuelle peut   |
  1823.        tre:
  1824.  
  1825.                empty _set
  1826.  
  1827.                Add (s,i) ou s est tout ensemble et i tout element (item).
  1828.  
  1829.             Si, dans le terme de droite d'une equation ayant (s,i) du c  |
  1830.        te  gauche, il y a une difference entre s etant vide ou n'etant pas
  1831.        vide, on peut reecrire la liste comme suit:
  1832.  
  1833.                empty _set
  1834.  
  1835.                Add (empty _set,i) ou i est un element (item) quelconque,
  1836.  
  1837.                 Add (Add (s,i),j) ou s est un ensemble quelconque et i, j,
  1838.        un element quelconque.
  1839.  
  1840.             Apres la creation de cette liste, on obtient  les  parties  de
  1841.        gauche  des  equations  en  appliquant  chaque  fonction a une com-
  1842.        binaison d'arguments tires de  la  liste.  Les  identificateurs  de
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.        valeurs  de  differents arguments recoivent des noms differents. La
  1853.        procedure  indiquee  ci-dessus  pour  les  fonctions  peut   |  tre
  1854.        appliquee  aux constructeurs; dans ce cas, elle donne les relations
  1855.        entre des termes ou les constructeurs sont utilises dans differents
  1856.        ordres.
  1857.  
  1858.  
  1859.                Exemples:
  1860.  
  1861.  
  1862.                a)         Pour l'operateur de  multiplication  de  nombres
  1863.        naturels portant la signature
  1864.  
  1865.                <<*>>:Natural, Natural -> Natural
  1866.  
  1867.                Cette procedure donne la partie  de  gauche  des  equations
  1868.        (incompletes)  suivantes.  L'utilisateur devra ajouter la partie de
  1869.        droite.
  1870.  
  1871.                Next (n) 0*0         ==         . |  | ;
  1872.  
  1873.                Next (n) 0*Next (n)         ==         . |  | ;
  1874.  
  1875.                Next (n)*0         ==         . |  | ;
  1876.  
  1877.                Next (n)*Next (m)         ==         . |  | ;
  1878.  
  1879.                b)         Pour les operateurs Is _in (est _dans) et Delete
  1880.        (supprimer,  dans  le  generateur  Set  (voir  le S D.6.2.1), cette
  1881.        approche est deja appliquee.
  1882.  
  1883.                c)         Pour la sorte  Colour,  les  constructeurs  sont
  1884.        Take  et Mix.  Un operateur analogue a Contains dans le S D.6.1.4.2
  1885.        doit  | tre defini pour les arguments.
  1886.  
  1887.                Take(p) ou p est toute couleur primaire
  1888.  
  1889.                Mix(p,c) ou p est toute couleur primaire et c  une  couleur
  1890.        quelconque.
  1891.  
  1892.                Etant donne que l'on avait annonce au S D.6.1.4.2  que  les
  1893.        equations completes seraient donnees pour cet operateur:
  1894.  
  1895.                Contains(Take(p),q) ==p=q;
  1896.  
  1897.                Contains(Mix(p,c),q) ==(p=q) OR Contains(c,q);
  1898.  
  1899.             Cette procedure de construction peut donner  plus  d'equations
  1900.        que  cela  n'est  necessaire,  mais  elle  est  tres  s  | re. Dans
  1901.        l'exemple susmentionne de multiplication des nombres  naturels,  il
  1902.        est vraisemblable que la propriete de commutativite de la multipli-
  1903.        cation sera indiquee et qu'en consequence, seule la derniere (ou la
  1904.        seconde) equation des trois premieres sera necessaire.
  1905.  
  1906.             La procedure decrite dans cette section peut  | tre  appliquee
  1907.        en   combinaison   avec   la  procedure  decrite  dans  la  section
  1908.        precedente, ou elle est utile pour la  t  |  che  <<Penser  _a  _un
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.        _enonce>>.
  1919.  
  1920.  
  1921.        D.6.3.3         Specification d'ensemble d'essai
  1922.  
  1923.  
  1924.             On peut aussi considerer les equations du point de vue  de  la
  1925.        mise  en oeuvre. Si les operateurs sont mis en oeuvre sous la forme
  1926.        de fonctions dans un langage de programmation, les  equations  mon-
  1927.        trent comment ces fonctions doivent  | tre testees.
  1928.  
  1929.             Il convient d'evaluer les expressions correspondant a la  par-
  1930.        tie  de  gauche  d'une  equation, de faire de m | me pour la partie
  1931.        droite de cette equation et de voir  si  elles  sont  equivalentes.
  1932.        C'est   la   construction  FOR  ALL  qui  pourrait  poser  certains
  1933.        problemes. Ceux-ci peuvent souvent
  1934.         | tre resolus de maniere pragmatique:
  1935.  
  1936.                Au lieu de tif de test peut utiliser   FOR ALL i IN Integer
  1937.  
  1938.                le dispositif  de  test  peut  utiliser  FOR  ALL  i  IN  {
  1939.        (em10,-1,0,1,1 } et proceder ainsi dans la plupart des cas.
  1940.  
  1941.             Considerer des equations comme necessaires a la mise en oeuvre
  1942.        peut   |  tre  utile  pour ce qui est de la t | che <<Penser _a _un
  1943.        _enonce>> dans la procedure du S D.6.3.1.
  1944.  
  1945.  
  1946.        D.6.4         Caracteristiques
  1947.  
  1948.  
  1949.             La presente section decrit certains  dispositifs  du  LDS  qui
  1950.        sont rarement necessaires dont on peut pratiquement se passer, mais
  1951.        qui rendent quelquefois la t | che plus facile.
  1952.  
  1953.  
  1954.        D.6.4.1         Operateurs caches
  1955.  
  1956.  
  1957.             Il arrive que l'ensemble des equations puisse  | tre simplifie
  1958.        ou  rendu  plus  lisible  gr  |  ce a l'introduction d'un operateur
  1959.        supplementaire, mais cet operateur ne devrait pas   |  tre  utilise
  1960.        dans  les  processus.  Cela signifie que l'operateur est visible de
  1961.        l'interieur mais cache en dehors de la definition de type.
  1962.  
  1963.             On  peut  atteindre  ce  resultat  en  definissant  un  <<type
  1964.        cache>>,  c'est-a-dire  un  type  que  l'utilisateur  ne  doit  pas
  1965.        employer. A partir de ce type cache, l'utilisateur peut heriter  de
  1966.        tous  les  operateurs  auxquels  il peut avoir acces; c'est le type
  1967.        herite qui doit   |  tre  utilise.  On  peut  s'assurer  qu'il  est
  1968.        correctement  employe en examinant toutes les declarations de vari-
  1969.        ables (aucune variable de sorte introduite par  le  type  cache  ne
  1970.        doit appara | tre).
  1971.  
  1972.             Ce qui caracterise les operateurs caches, c'est qu'ils peuvent
  1973.         | tre atteints par une restriction de leur visibilite  aux  seules
  1974.        equations. On peut le faire en placant un point d'exclamation apres
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.  
  1984.        l'operateur.
  1985.  
  1986.  
  1987.                Exemple:
  1988.  
  1989.  
  1990.             La maniere courante de faire un ensemble d'un element a partir
  1991.        du generateur Set est la suivante:
  1992.  
  1993.                Add(empty _set,x)
  1994.  
  1995.        et c'est ainsi que doit le faire chaque utilisateur. Dans les equa-
  1996.        tions,  le  specificateur  peut  utiliser un operateur special, par
  1997.        exemple:
  1998.  
  1999.                Mk _set!:Item->Set;
  2000.  
  2001.        defini par l'equation:
  2002.  
  2003.                Mk _set!(itm) == Add(empty _set,itm);
  2004.  
  2005.        qui peut  | tre utilise dans des definitions de type  partiel  mais
  2006.        non dans le corps de processus en LDS.
  2007.  
  2008.  
  2009.        D.6.4.2         Relations d'ordre
  2010.  
  2011.  
  2012.             Lorsqu'il faut specifier une relation d'ordre sur les elements
  2013.        d'une  sorte,  cela  signifie  en general qu'il faut definir quatre
  2014.        operateurs (<,<=,>,>=) et les proprietes  mathematiques  ordinaires
  2015.        (transitivite,  etc.).  S'il  y  a  de  nombreux litteraux, il faut
  2016.        egalement donner de nombreuses equations. Par exemple, le  type  de
  2017.        donnees predefinies Character est defini de cette maniere.
  2018.  
  2019.             Le LDS comporte une caracteristique qui permet  d'abreger  ces
  2020.        definitions  de  type  longues,  peu  lisibles et ennuyeuses: c'est
  2021.        l'abreviation ORDERING (relation d'ordre).
  2022.  
  2023.             ORDERING est donne dans la liste d'operateurs,  de  preference
  2024.        au  debut  ou  a  la  fin de celle-ci. Cela permet d'introduire des
  2025.        operateurs de relation d'ordre et les equations  normales.  Lorsque
  2026.        ORDERING  est  specifie,  il  faut  donner  les  litteraux, s'il en
  2027.        existe, dans l'ordre ascendant.
  2028.  
  2029.  
  2030.                Exemple:
  2031.  
  2032.  
  2033.                NEWTYPE Even _decimal _digit
  2034.  
  2035.                  LITERALS 0,2,4,6,8
  2036.  
  2037.                  OPERATORS
  2038.  
  2039.                    ORDERING
  2040.  
  2041.  
  2042.  
  2043.  
  2044.  
  2045.  
  2046.  
  2047.  
  2048.  
  2049.  
  2050.                ENDNEWTYPE Even _decimal _digit;
  2051.  
  2052.             Maintenant, l'ordre 0<2<4<6<8 est implicite.
  2053.  
  2054.             Au S D.6.2.2 (Heritage), on soulignait qu'il fallait s'assurer
  2055.        que  les litteraux etaient ajoutes a une sorte heritee. Il convient
  2056.        d'en indiquer ici la raison.
  2057.  
  2058.             Admettons que l'on desire l'extension  suivante  de  la  sorte
  2059.        Even _decimal _digit:
  2060.  
  2061.                NEWTYPE Decimal _digit
  2062.  
  2063.                  INHERITS Even _decimal _digit
  2064.  
  2065.                  OPERATORS ALL
  2066.  
  2067.                  ADDING
  2068.  
  2069.                    LITERALS 1,3,5,7,9
  2070.  
  2071.                    AXIOMS
  2072.  
  2073.                      0<1; 1<2;
  2074.  
  2075.                      2<3; 3<4;
  2076.  
  2077.                      4<5; 5<6;
  2078.  
  2079.                      6<7; 7<8;
  2080.  
  2081.                      8<9
  2082.  
  2083.                ENDNEWTYPE Decimal _digit;
  2084.  
  2085.             Les axiomes donnes ici  ne  peuvent   |  tre  omis.  Sans  ces
  2086.        axiomes, il ne peut y avoir qu'un ordre dit partiel:
  2087.  
  2088.                0<2<4<6<8
  2089.  
  2090.        et
  2091.  
  2092.                1<3<5<7<9.
  2093.  
  2094.             Avec les axiomes ci-dessus, on obtient un ordre complet:
  2095.  
  2096.                0<1<2<3<4<5<6<7<8<9
  2097.  
  2098.        mais  avec  l'axiome  <<9<0>>  au  lieu  de  l'ensemble   d'axiomes
  2099.        ci-dessus, l'ordre complet serrait le suivant:
  2100.  
  2101.                1<3<5<7<9<0<2<4<6<8.
  2102.  
  2103.  
  2104.        D.6.4.3         Sortes avec champs
  2105.  
  2106.  
  2107.  
  2108.  
  2109.  
  2110.  
  2111.  
  2112.  
  2113.  
  2114.  
  2115.  
  2116.             Comme indique au S 5.4.1.10  de  la  Recommandation,  on  peut
  2117.        definir une sorte structuree sans constructions speciales, mais les
  2118.        sortes structurees sont a la fois courantes et utiles, ce qui  jus-
  2119.        tifie certaines constructions supplementaires dans le langage.
  2120.  
  2121.             Une sorte structuree devrait  | tre utilisee lorsqu'une valeur
  2122.        d'objet  est  formee  par  l'association  de  valeurs  de plusieurs
  2123.        sortes. Chaque valeur de cette association est caracterisee par  un
  2124.        nom, appele nom de champ. La sorte d'un champ est fixe.
  2125.  
  2126.  
  2127.                Exemples:
  2128.  
  2129.  
  2130.                NEWTYPE Subscriber
  2131.  
  2132.                  STRUCT numbers Number _key;
  2133.  
  2134.                      name Name _key;
  2135.  
  2136.                      admin Administrative;
  2137.  
  2138.                ENDNEWTYPE Subscriber;
  2139.  
  2140.                NEWTYPE Name _key
  2141.  
  2142.                  STRUCT name,
  2143.  
  2144.                      street Charstring;
  2145.  
  2146.                      number Integer;
  2147.  
  2148.                      city Charstring;
  2149.  
  2150.                ENDNEWTYPE Name _Key;
  2151.  
  2152.             Avec une sorte structuree, certains  operateurs  sont  definis
  2153.        implicitement:
  2154.  
  2155.                a)         l'operateur constructeur, <<(.<<avant,  et>>.)>>
  2156.        apres les valeurs de champ;
  2157.  
  2158.                b)         les operateurs de selection de champ, les  vari-
  2159.        ables  de  la sorte structuree suivies par un ! et le nom de champ,
  2160.        ou suivies par le nom de champ entre parentheses. Il  ne  faut  pas
  2161.        confondre   la  variable  suivie  d'un  !  avec  l'operateur  cache
  2162.        (S D.6.4.1).
  2163.  
  2164.             On trouvera un exemple dans la figure D-6.4.1.
  2165.  
  2166.  
  2167.                            Figure D.6.4.1 (comme tableau) [T39.100], p. 13
  2168.  
  2169.  
  2170.  
  2171.  
  2172.        D.6.4.4         Sortes indexees
  2173.  
  2174.  
  2175.  
  2176.  
  2177.  
  2178.  
  2179.  
  2180.  
  2181.  
  2182.             Une sorte indexee est une sorte pour laquelle le type  a  pour
  2183.        nom  d'operateur  Extract!  (extraction). Dans les types de donnees
  2184.        predefinies, le generateur Array est un tel type.  Array  est  l'un
  2185.        des exemples les plus courants de type indexe.
  2186.  
  2187.             Pour  l'operateur  cache  Extract!,  il  existe  une   syntaxe
  2188.        concrete   speciale  qui  doit   |  tre  appliquee  en  dehors  des
  2189.        definitions de type.
  2190.  
  2191.             On peut penser que le type Index dans le generateur  predefini
  2192.        Array  doit   |  tre  un  type <<simple>> comme Integer, Natural ou
  2193.        Character. Toutefois, il n'y a pas de raison pour qu'une  structure
  2194.        comme Name _key ne puisse pas  | tre  utilisee comme Index.
  2195.  
  2196.  
  2197.                Exemple:
  2198.  
  2199.  
  2200.                NEWTYPE Subsc _data _base
  2201.  
  2202.                  Array (Name _key, Subscriber)
  2203.  
  2204.                ENDNEWTYPE Subsc _data _base;
  2205.  
  2206.             Les sortes Name _key et Subscriber sont  celles  qui  ont  ete
  2207.        definies  dans  la  section  precedente. Supposons qu'il existe une
  2208.        procedure Bill comportant un parametre de sorte Subscriber  et  que
  2209.        cette  procedure  soit definie dans un processus qui comporte aussi
  2210.        une variable Sub _db de la sorte  Subsc _data _base. Dans  ce  pro-
  2211.        cessus, l'appel suivant pourrait appara | tre.
  2212.  
  2213.                CALL Bill (Sub _db)  (.  `P.M.`,  `Downingstreet`10.  `Lon-
  2214.        dres`.)));
  2215.  
  2216.  
  2217.        D.6.4.5         Valeur par defaut de variables
  2218.  
  2219.  
  2220.             Comme indique dans la section  concernant  la  declaration  de
  2221.        variables  (S D.3.10.1),  il  est possible d'affecter des valeurs a
  2222.        une variable immediatement apres la  declaration.  Cependant,  cer-
  2223.        tains  types  ont  une valeur qui sera (presque) toujours la valeur
  2224.        initiale d'une variable. Il existe une caracteristique  qui  permet
  2225.        d'eviter  d'ecrire  la  valeur initiale pour chaque declaration: la
  2226.        clause DEFAULT.
  2227.  
  2228.             A titre d'exemple, on peut considerer l'ensemble. Il est  tres
  2229.        probable  que  presque  toutes les variables, de tout ensemble ima-
  2230.        ginaire, seront initialisees avec empty _set.
  2231.  
  2232.             La notation:
  2233.  
  2234.                DEFAULT empty _set
  2235.  
  2236.        apres la liste d'equations indique que chaque  variable  de  chaque
  2237.        instantiation  de  ce generateur sera initialisee a la valeur empty
  2238.        _set de cette instantiation,  sauf  s'il  y  a  une  initialisation
  2239.  
  2240.  
  2241.  
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.  
  2248.        explicite (voir le S D.3.10.1.)
  2249.  
  2250.             S'il n'est par s | r que la  valeur  initiale  de  toutes  les
  2251.        variables  d'une  sorte  soit la m | me, il ne faut pas utiliser la
  2252.        clause DEFAULT, sinon il est difficile d'eviter des surprises.
  2253.  
  2254.  
  2255.        D.6.4.6         Operateurs actifs
  2256.  
  2257.  
  2258.             Les utilisateurs qui connaissent la  Recommandation  Z.104  de
  2259.        1984 concernant le LDS pourraient se demander ce qui est arrive aux
  2260.        operateurs dits  actifs.  En  fait,  cette  caracteristique  a  ete
  2261.        supprimee, pour les raisons suivantes:
  2262.  
  2263.                a)          elle n'est pas necessaire  car  les  operateurs
  2264.        courants  et les procedures et/ou macros offrent la m | me capacite
  2265.        d'expression;
  2266.  
  2267.                b)         elle compromet la lisibilite des equations;
  2268.  
  2269.                c)         de nombreux utilisateurs ont eu des  difficultes
  2270.        a l'utiliser correctement;
  2271.  
  2272.                d)         elle ne s'integre  pas  au  modele  de  type  de
  2273.        donnees  abstrait  fonde sur les algebres initiales qui constituent
  2274.        le modele choisi comme base mathematique de cette partie du LDS.
  2275.  
  2276.  
  2277.  
  2278.  
  2279.        MONTAGE: S D.7 SUR LE RESTE DE CETTE PAGE
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.  
  2306.  
  2307.  
  2308.  
  2309.  
  2310.  
  2311.