# Exercice avec des types article

## ▸Objectifs

- L'objectif est d'écrire quelques fonctions manipulant des intervalles de réels, représentés avec un type article.

## ▸Étapes à suivre

#### ▸Première partie : les intervalles compacts

- Créez un nouveau fichier mission2.adb contenant la structure habituelle d'un programme Ada.
- Définissez un type article `T_Intervalle` permettant de représenter les intervalles de réels fermés et bornés, c'est-à-dire de la forme [inf, sup] où inf et sup sont des réels. Remarquez qu'il suffit de connaître inf et sup pour définir l'intervalle.
- Définissez une fonction `Intervalle_Image` qui reçoit un `T_Intervalle` et renvoie une chaîne de caractères, de la forme "[3,5]" (pour un affichage pas trop laid, convertir les bornes en entier, ou alors utiliser l'acteur DFloat).
- Ajoutez une fonction `Est_Inclus` qui reçoit deux arguments A et B de type `T_Intervalle` et qui renvoie vrai si et seulement si A est inclus dans B. (Le corps de la fonction tient en une seule ligne.)
- Ajoutez une fonction `Disjoints` ayant la même signature que `Est_Inclus` (même arguments, même type de résultat) et qui renvoie vrai si et seulement si A et B sont disjoints. (Elle tient aussi en une seule ligne.)
- Ajoutez une procédure `Afficher_Relation` qui reçoit deux arguments A et B de type `T_Intervalle` et qui affiche l'un ou l'autre des messages suivants (selon ce qui est le plus adéquat) :
  - `A est inclus dans B`
  - `B est inclus dans A`
  - `A et B sont disjoints`
  - `A et B ne sont pas disjoints` (mais aucun n'est inclus dans l'autre)
  Vous pouvez utiliser `Intervalle_Image` pour afficher l'intervalle lui-même au lieu de "A" ou "B".
- Pour tester, créez trois constantes C, D, E, représentant respectivement les intervalles [5, 10], [7, 8], et [4, 6]. Puis, dans le corps du programme principal, invoquez `Afficher_Relation` avec les paires d'arguments (C,D), (D,C), (C,E), et (D,E).
  Grâce à votre maîtrise absolue des relations ensemblistes, vous pouvez prévoir à l'avance ce qui sera affiché.

#### ▸Deuxième partie : produits cartésiens d'intervalles compacts

- Dans le même programme, définissez un type `T_Prod` représentant un produit cartésien de deux intervalles. Par exemple : [1,5]x[3,8] est un élément de T_Prod
- Définissez une fonction `Prod_Image` qui reçoit un `T_Prod`et qui renvoie une chaîne de caractère, par exemple "[1,5]x[3,8]". Vous pensez spontanément à utiliser Intervalle_Image, c'est bien.
- Comme ci-dessus, définissez les fonctions `Prod_Est_Inclus` et `Prod_Disjoints` qui reçoivent deux arguments A et B de type `T_Prod` et qui indiquent si A est inclus dans B ou si A et B sont disjoints (respectivement).
  Le corps de ces fonctions tient toujours en une seule ligne.
- Comme ci-dessus, ajoutez une procédure `Prod_Afficher_Relation` qui joue le même rôle que `Afficher_Relation` mais pour des arguments de type `T_Prod`.
- Testez dans le corps du programme principal en invoquant `Prod_Afficher_Relation` avec les paires d'arguments suivants :
  - CxC et DxD
  - CxD et DxC
  - DxC et ExC
  en prévoyant à l'avance ce qui sera affiché.

## ▸Bilan

- Avec le type T_Prod, vous avez expérimenté un type article imbriqué dans un autre type article.
- Vous savez maintenant que vous devez vous souvenir du produit cartésien À VIE.