Les séquences sont définies par analogie avec le type texte vu dans le chapitre 1. Nous présentons tout d'abord les constructeurs, testeur et sélecteurs des séquences. Puis nous étudions les modèles de découpage d'une séquence selon les extrémités, et selon une propriété.
- Élément : un type
On travaille sur des séquences d'Éléments.
- désigne la séquence vide. Le testeur associé est EstVide?
EstVide? : une séquence d'Éléments un booléen
- désigne la séquence construite en ajoutant l'élément
à droite de la séquence
.
Les sélecteurs associés sont début et dernier.
: une séquence d'Éléments, un Élément
une séquence non vide d'Éléments
début : une séquence non vide d'Éléments
une séquence d'Éléments
{début(
)
}
dernier : une séquence non vide d'Éléments
un Élément
{dernier(
)
}
- désigne la séquence construite en ajoutant l'élément
à gauche de la séquence
.
Les sélecteurs associés sont premier et fin.
: un Élément, une séquence d'Éléments
une séquence non vide d'Éléments
premier : une séquence non vide d'Éléments
un Élément
{premier(
)
}
fin : une séquence non vide d'Éléments
une séquence d'Éléments
{fin(
)
}
- Une séquence peut être décrite en extension, en énumérant ses
éléments séparés par des virgules, le tout étant entouré de crochets :
. En particulier,
désigne un singleton :
c'est la séquence formée du seul élément
:
- Le prédicat EstSingleton? détermine si une séquence est
un singleton.
EstSingleton? : une séquence d'Éléments
un booléen
EstSingleton?(X)
non EstVide?(X) et puis EstVide?(début(X))
non EstVide?(X) et puis EstVide?(fin(X))
- On peut concaténer deux séquences avec & :
& : deux séquences d'Éléments
une séquence d'Éléments
Découpage isolant... |
Forme des équations de récurrence | Forme des réalisations récursives de f(X) | Variante : séquence non vide |
Le premier |
f(![]() |
Si EstVide?(X) alors ... | f(![]() |
élément | f(![]() |
sinon soit e = premier(X), S = fin(X) | f(![]() |
dans ... | { S non vide } | ||
Le dernier |
f(![]() |
Si EstVide?(X) alors ... | f(![]() |
élément | f(![]() |
sinon soit e = dernier(X), S = début(X) | f(![]() |
dans ... | { S non vide } | ||
Le premier |
f(![]() |
Si EstVide?(X) alors ... | f(![]() |
et | f(![]() |
sinon si EstVide?(fin(X)) alors ... | f(![]() |
le dernier | f(
![]() |
sinon soit e1 = premier(X), | f(
![]() |
élément | e2 = dernier(X), | { S non vide } | |
S = début(fin(X)) dans ... | |||
Les deux |
f(![]() |
Si EstVide?(X) alors ... | f(![]() |
premiers | f(![]() |
sinon si EstVide?(fin(X)) alors ... | f(![]() |
éléments | f(
![]() |
sinon soit e1 = premier(X), | f(
![]() |
e2 = premier(fin(X)), | { S non vide } | ||
S = fin(fin(X)) dans ... | |||
Les deux |
f(![]() |
Si EstVide?(X) alors ... | f(![]() |
derniers | f(![]() |
sinon si EstVide?(début(X)) alors ... | f(![]() |
éléments | f(
![]() |
sinon soit e2 = dernier(X), | f(
![]() |
e1 = dernier(début(X)), | { S non vide } | ||
S = début(début(X)) dans ... | |||
|
P est une propriété sur les Éléments :
P : un Élément un booléen
Découper une séquence donnée S selon la propriété P consiste à identifier le premier élément e de la séquence (de gauche à droite) vérifiant P (tel que P(e) soit vrai). Cet élément est appelé l'élément de séparation selon P. S est alors découpée en deux sous-séquences D et F (S = D&F), respectivement appelées le début de S et la fin de S selon P. Par convention, l'élément de séparation, s'il existe, est le premier élément de la séquence de fin F. Si aucun élément de la séquence donnée ne vérifie P, F est vide. Si le premier élément de S vérifie P, D est vide. Si S est vide, D et F le sont aussi.
On donne ici les équations de récurrence pour calculer le début et la fin selon P :
LeDébutSelonP: une séquence d'Éléments une séquence d'Éléments
{séquence de début de la séquence donnée jusqu'au premier élément (exclu) vérifiant P }
(1) LeDébutSelonP([]) = []
(2) LeDébutSelonP() = si P(e) alors [] sinon
LeDébutSelonP(S)
LaFinSelonP: une séquence d'Éléments une séquence d'Éléments
{séquence de fin de la séquence donnée à partir du premier élément (inclus) vérifiant P }
(1) LaFinSelonP([]) = []
(2) LaFinSelonP() = si P(e) alors
sinon
LaFinSelonP(S)
DebEtFinSelonP: une séquence d'Éléments
<une séquence d'Éléments, une séquence d'Éléments>
{DebEtFinSelonP(S) = < LeDébutSelonP(S), LaFinSelonP(S) > }
(1) DebEtFinSelonP([]) = <[], []>
(2) DebEtFinSelonP() = si P(e) alors <[],
>
sinon soit <D, F> = DebEtFinSelonP(S)
dans <, F>